
以下是第八周周四学习内容的详细展开。今天你将正式进入命令注入的世界——一种比 SQL 注入更直接、危害更剧烈的漏洞。通过将恶意系统命令拼接到合法输入中你可以直接操控服务器操作系统。你会在 DVWA 靶场上亲身体验从“仅能 ping 一个 IP”到“完全控制服务器”的跨越。第八周·周四命令注入基础——拼接、|、;与简单演示 今日学习目标达成效果能准确描述命令注入漏洞的成因应用程序将用户输入直接拼接到系统命令字符串中并执行未做充分过滤或转义能区分命令注入与代码注入命令注入直接执行操作系统命令如whoami、ls代码注入则执行脚本语言代码如eval()能熟练使用多种命令分隔符、、|、||、;在注入点拼接额外命令并理解每个符号的运行逻辑差异能在 DVWA 低安全等级的 Command Injection 关卡中通过修改target参数执行任意系统命令如whoami、ls -la、cat /etc/passwd能解释为何简单的黑名单过滤如禁止、;容易被绕过以及输入校验、最小权限和禁用危险函数等防御手段能从安全视角意识到命令注入往往可以直接获取服务器权限是“高危”漏洞修复优先级最高。 一、命令注入漏洞的本质让服务器执行你的指令许多 Web 应用需要与操作系统交互例如发送 Ping 请求检测主机连通性调用系统压缩工具处理文件执行自定义脚本处理数据。如果开发人员直接使用拼接字符串的方式来构建系统命令例如system(ping -c 4 .$_GET[ip]);那么当用户输入正常 IP127.0.0.1时执行的命令是ping -c 4 127.0.0.1完全符合预期。但如果攻击者输入127.0.0.1; whoami最终执行的就是ping -c 4 127.0.0.1; whoami在 Linux Shell 中分号;表示顺序执行多条命令。于是服务器先执行ping然后执行whoami返回 Web 服务运行的身份如www-data。这就是命令注入的核心——通过特殊字符打破原有命令的边界追加攻击者自己的指令。 二、常用命令分隔符Shell 操作符在不同操作系统Linux/Windows和不同 Shell 环境下可以使用的分隔符略有差异。以下是 Linux Shell 中最常见的分隔符示例执行逻辑;cmd1; cmd2顺序执行 cmd1 和 cmd2无论 cmd1 是否成功cmd1 cmd2仅当 cmd1成功执行后才执行 cmd2cmd1 cmd2后台执行 cmd1同时立即执行 cmd2注意与区别cmd1或$()echowhoami 或echo $(whoami)命令替换将命令的输出作为另一个命令的参数在命令注入中最常用的是;、、|因为它们可以无条件或根据简单条件执行新命令。你会在 DVWA 中看到简单地追加; ls即可列出目录。 三、DVWA Command Injection 关卡分析DVWA 的“Command Injection”模块模拟了 Ping 功能。用户输入一个 IP 地址服务器执行ping命令并返回结果。根据安全级别不同过滤强度各异Low完全没有过滤用户输入直接拼接到ping命令后面。Medium使用简单黑名单将和;替换为空但未处理其他分隔符。High更严格的黑名单但仍有绕过可能不今日重点。今天我们先攻克Low级别体验最原生的命令注入。✍️ 四、动手实践在 DVWA Low 级别执行任意系统命令环境DVWA安全等级设为 Low进入“Command Injection”页面。页面显示一个输入框Enter an IP address提交后返回 ping 结果。实践 1正常 ping 测试输入127.0.0.1点击 Submit。页面返回类似PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq1 ttl64 time0.052 ms ... --- 127.0.0.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3092ms说明功能正常。实践 2使用分号追加命令输入127.0.0.1; whoami提交。输出除了 ping 结果外末尾出现www-data或相应 Web 用户。这证明whoami命令被执行你已成功注入。测试题相关这就是一个典型的命令注入 payload。实践 3列出当前目录文件输入127.0.0.1; ls -la你会看到 Web 目录下所有文件的列表。可以寻找配置文件、数据库备份等。实践 4读取敏感文件输入127.0.0.1; cat /etc/passwd输出系统用户列表。尝试; cat /etc/shadow可能因权限不足失败但仍体现了攻击方向。实践 5使用其他分隔符验证127.0.0.1 whoami如果 ping 成功则执行 whoami。127.0.0.1 | whoami将 ping 的输出通过管道传给 whoamiwhoami 忽略输入直接打印用户名。127.0.0.1 || whoamiping 成功则不会执行 whoami可以故意输入错误 IP 如999.999.999.999使 ping 失败触发||后的命令。重要通过多种分隔符即使某些被过滤仍可能找到绕过方式。实践 6使用命令替换获取信息输入127.0.0.1; echo $(uname -a)显示内核版本。或使用反引号127.0.0.1; echo \id注意转义。安全观察所有这些命令都以 Web 服务器进程的权限执行。如果该进程权限较高如 root系统即可被完全控制。 五、漏洞根源与防御思路概要1. 根源将不可信的输入直接拼接到系统命令中没有进行任何安全处理。使用system()、exec()、shell_exec()、passthru()等危险函数。2. 防御措施今天理解即可具体实现后续学习避免执行外部命令如果可能使用语言内置函数代替如 Python 的subprocess不调用 shell。输入校验严格限制输入格式如仅允许数字和点构成的 IP 地址使用白名单。参数化/数组传递不使用拼接字符串而是将参数作为数组传递给执行函数避免 shell 解析特殊字符。最小权限Web 进程以低权限用户运行限制可执行的命令和可访问的文件。禁用危险字符过滤;|$()等符号但需注意绕过不能作为唯一防线。使用escapeshellarg()/escapeshellcmd()PHP对参数进行转义但用法不当仍有风险。 六、课后测试题与解析测试题 1在 DVWA 命令注入 Low 难度中执行whoami命令。写出你输入的内容并解释为什么分号能起到作用。参考答案输入127.0.0.1; whoami解释Web 应用原本会执行ping -c 4 127.0.0.1。分号;在 Linux Shell 中用于分隔多条命令且不论前一条命令是否成功都会继续执行后一条命令。因此攻击者输入127.0.0.1; whoami后实际执行的命令变为ping -c 4 127.0.0.1; whoami。Shell 依次执行 ping 和 whoami并输出结果。测试题 2扩展思考如果;被过滤你还能使用什么分隔符参考答案可以使用如前一条成功则执行、|管道、||前一条失败才执行等。例如127.0.0.1 whoami或127.0.0.1 | whoami。如果这些也被过滤还可以尝试编码绕过或使用换行符%0a等方法取决于过滤强度。✅ 今日学习效果自检清单我能解释命令注入的成因并给出真实世界的例子我能至少使用三种不同的分隔符在 DVWA Low 中执行额外命令我成功执行了whoami、ls、cat /etc/passwd等操作我理解命令注入与文件包含导致的代码执行有所不同我能说出至少两种防御命令注入的方法我意识到最小权限原则对降低命令注入危害的重要性⚠️ 阶段避坑重点不要误用和是后台运行在命令注入中可能同时输出混乱但仍能执行需要前一个命令成功。实战中需根据响应情况选择分隔符。注意 URL 编码如果使用 GET 请求提交特殊字符如;、|、空格可能需要编码;为%3B空格为或%20。DVWA 的输入框自动处理但若使用 curl 或 Burp需注意。不要在生产环境尝试破坏性命令如rm -rf /等。即使是靶场也应避免不可逆操作。命令注入不一定有回显有时命令执行但无输出可通过延时sleep或外带数据DNS/HTTP间接判断。今天仅接触有回显的情况后续盲注入再深入。过滤总会有绕过黑名单难以穷尽所有特殊字符最安全的还是避免将用户输入传给 shell。今天你首次尝到了直接命令执行的威力。明天我们将进入命令注入的进阶包括无回显的盲命令注入、拼接绕过技巧以及如何通过命令注入获取交互式 Shell。请保留 DVWA 环境明日继续。