☰
【八个月网安课程】第八周·周四:命令注入基础——拼接 、|、; 与简单演示
2026/10/2 18:09:00 网站建设 项目流程

以下是第八周周四学习内容的详细展开。今天你将正式进入命令注入的世界——一种比 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 环境,明日继续。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询