命令注入新玩法:巧借环境渗透测试目标
字数 1388 2025-08-18 11:37:53
命令注入高级利用技术:环境渗透与选项注入
0x00 引言
本文介绍了一种非标准的命令注入技术,通过巧妙利用目标环境实现命令注入,而非传统的命令分隔符或命令替换符注入。这种技术在常规命令注入讨论中较少被提及,但具有实际应用价值。
0x01 案例背景
漏洞场景
- 目标执行
file命令,接受两个参数f1和f2 - 输入经过多重过滤:
- 正则过滤引号(防止写webshell)
- 过滤常见命令分隔符(
;)和命令替换符($()) - 过滤常见命令(
ls、cat) - 使用引号包裹所有输入
防御措施分析
$f1 = preg_replace("/\'|\"|;|\$\(|`|ls|cat/", "", $_GET['f1']);
$f2 = preg_replace("/\'|\"|;|\$\(|`|ls|cat/", "", $_GET['f2']);
$cmd = "file '" . $f1 . "' '" . $f2 . "'";
system($cmd);
0x02 突破思路
1. 正则表达式审计
审查正则表达式时关注四个关键点:
a) 多行模式修饰符(/m)
- 问题:当用于允许字符时可能产生逻辑漏洞
- 示例:IP验证可能被换行符绕过
b) 遗漏匹配对象末尾的换行符
- 问题:某些模式会忽略字符串末尾的换行符
- 示例:
preg_replace("/[^a-z0-9]/i", "", $input)可能漏过滤末尾换行符
c) 允许空白字符
- 问题:可能遗漏换行符等空白字符
- 示例:
preg_replace("/[^a-z0-9\s]/i", "", $input)中的\s包含换行符
d) 误写反斜杠匹配模式
- 关键发现:正则中
\\实际应为\\\\ - 影响:无法正确过滤反斜杠
2. 引号逃逸技术
a) 闭合手法
- 原理:添加引号与原有引号配对闭合
- 示例:
file "foo" ";id;"→file "foo"";id;""
b) 转义手法
- 原理:使用反斜杠转义引号
- 示例:
file "foo\" ";id #"
3. 命令选项注入
当无法直接注入命令时,可注入命令选项:
file命令选项分析
-f选项:从文件中读取文件列表- 利用方式:
file "foo\" " -f /etc/passwd #"
0x03 完整攻击链
- 利用正则漏洞:反斜杠未被正确过滤
- 引号逃逸:使用反斜杠转义引号
- 选项注入:注入
-f选项读取文件 - 路径猜解:使用通配符模式匹配未知文件路径
攻击示例
f1=foo\&f2= -f .f1a9_/.fl?g_15_here.txt bar #
0x04 非预期解法
正则过滤缺陷深入分析
- 错误正则:
/\\|\n/实际被解释为/\|\n/ - 结果:只过滤
|\n组合,单独换行符\n未被过滤
直接命令注入
f1=foo\&f2=%0a/bin/gr[d-f]p+-r+.+.+%23
解释:
%0a:换行符(命令分隔符)/bin/gr[d-f]p:匹配grep命令-r . .:递归搜索当前目录
0x05 实际赏金案例
场景描述
- 目标使用
zip命令打包目录 - 用户可控制归档文件名
- 严格过滤命令分隔符和替换符
- 禁止出口流量
利用方法
发现zip命令的-T和--unzip-command选项可执行命令:
zip archive.zip -T -TT "id"
0x06 防御建议
-
正确编写正则表达式
- 使用
\\\\匹配反斜杠 - 明确处理换行符
- 使用
-
参数处理
- 使用白名单而非黑名单
- 避免将用户输入直接拼接至命令
-
命令执行替代方案
- 使用语言原生API而非系统命令
- 如必须使用命令,应严格限制参数
-
深度防御
- 限制命令选项
- 实施最小权限原则
0x07 总结
本文展示了命令注入的高级利用技术,重点包括:
- 正则表达式审计技巧
- 引号逃逸方法
- 命令选项注入技术
- 非预期解法的发现思路
- 实际漏洞赏金案例的应用
这些技术扩展了传统命令注入的利用思路,强调了环境分析和深度审计的重要性。