以下是第八周周四学习内容的详细展开。今天你将正式进入命令注入的世界——一种比 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成功执行后才执行 cmd2 |
& | cmd1 & 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_seq=1 ttl=64 time=0.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 的输出通过管道传给 whoami(whoami 忽略输入,直接打印用户名)。127.0.0.1 || whoami:ping 成功则不会执行 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 环境,明日继续。