DVWA Medium Command Injection安全测试与防护分析
注意:有关Command Injection漏洞的基础知识与原理已在上篇文章指出,此处不再解释。
可参考该文章https://www.cnblogs.com/lky-sec/articles/21412117
本文仅用于网络安全学习与防御研究。所有测试均在本人本地部署、合法授权的 DVWA 靶场中进行,禁止将相关方法用于任何未授权系统。
此处重新补充一下命令
连接符 作用 示例 执行逻辑 ; 顺序执行 127.0.0.1;whoami Ping 执行完后继续执行 whoami && 前一个成功才执行后一个 127.0.0.1&&whoami Ping 成功后执行 whoami || 前一个失败才执行后一个 127.0.0.1||whoami Ping 失败时执行 whoami | 管道连接 127.0.0.1|whoami 将前一个命令输出传给后一个命令,同时可造成额外命令执行 & 后台执行 127.0.0.1&whoami 前一个命令放到后台,并继续执行后一个命令
中等难度Command Injection
一 测试范围与环境
| 项目 | 配置 |
|---|---|
| 测试环境 | 本地 DVWA 靶场 |
| 安全等级 | Medium |
| 测试系统 | Kali Linux |
| 测试工具 | Firefox、Burp Suite |
| 测试方式 | 黑盒测试、源码审计 |
| 授权情况 | 本人本地靶场,合法授权 |
二 页面与请求分析
1. 设置难度等级
进入 DVWA Security,将安全等级设置为 Medium,随后进入 Command Injection 模块。

2. 观察模块正常功能
输入127.0.0.1 观察页面返回 Ping 执行结果,确认模块正常工作。

3. 使用Burp Suite进行抓包分析
开启Burp Suite Proxy模块进行拦截,提交一次正常请求。

三 手工黑盒测试
1. 使用Repeater模块
右键将正常请求发送到 Burp Suite Repeater。

2. 测试命令
127.0.0.1;whoami 发现返回空白。

127.0.0.1&&whoami 发现返回ping结果但无whoami结果,与本身命令相矛盾。

经查资料,&是POST参数分隔符,并未被当成命令执行,因此进行URL编码为%26 观察返回结果,为空白。

127.0.0.1||whoami返回ping结果,符合本身命令。

127.0.0.1|whoami 返回whoami结果。

127.0.0.1&whoami转为127.0.0.1%26whoami 发现whoami结果在ping第一个和第二个结果之间,符合本身命令。

结合这些测试结果,得出结论;&&被过滤。
四 代码审计
1. 点击 View Source 查看源码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
2.源码分析
Medium 等级首先通过:$target = $_REQUEST[ 'ip' ];获取用户提交的 ip 参数,随后定义黑名单:
$substitutions = array(
'&&' => '',
';' => '',
);
并使用 str_replace() 将 && 和 ; 替换为空:
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
相比Low等级,Medium增加了对部分命令连接符的过滤,因此使用&&、;等方式无法直接完成命令注入。
但黑名单只包含 && 和 ;,并未过滤单个 &、| 等其他 Shell 特殊字符,因此仍可通过:
127.0.0.1&whoami
或:
127.0.0.1|whoami
绕过过滤。
同时,过滤后的$target仍然被直接拼接到ping命令中:
$cmd = shell_exec( 'ping -c 4 ' . $target );
因此,该漏洞的根本原因是程序采用不完整的黑名单过滤用户输入,同时仍将用户可控参数直接拼接到系统命令中,导致命令注入漏洞依然存在。
3.修复方案
1)对ip参数进行严格的IP地址格式校验,仅允许合法IPv4或IPv6地址。
2)避免将用户输入的$target直接拼接到shell_exec()系统命令中。
3)避免使用str_replace()黑名单方式过滤&&、;等特殊字符,应采用白名单校验机制。
4)优先使用不经过Shell的安全接口实现Ping等网络检测功能。
5)必须调用系统命令时,对传入参数进行严格转义和安全处理。
6)对Web服务及系统命令执行账户采用最小权限原则,限制命令执行后的影响范围。
7)对异常参数、特殊字符以及高频命令请求进行日志记录与安全监控。
五 Low与Medium差异
| 对比项 | Low | Medium |
|---|---|---|
| 参数获取方式 | $_REQUEST['ip'] | $_REQUEST['ip'] |
| 输入过滤 | 无 | 使用黑名单过滤 |
| 黑名单内容 | 无 | &&、; |
| 过滤方式 | 无 | str_replace() 替换为空 |
| IP格式校验 | 无 | 无 |
| 用户输入处理 | 直接使用 | 过滤部分特殊字符后使用 |
| 系统命令执行函数 | shell_exec() | shell_exec() |
| 命令拼接方式 | 用户输入直接拼接到 ping 命令 |
过滤后仍直接拼接到 ping 命令 |
; 命令连接符 |
可直接利用 | 被过滤 |
&& 命令连接符 |
可直接利用 | 被过滤 |
& 命令连接符 |
可利用 | 未过滤,仍可利用 |
| 管道符 |
可利用 | 未过滤,仍可利用 |
| 命令注入漏洞 | 存在 | 仍然存在 |
| 主要防护措施 | 无明显防护 | 增加部分危险字符黑名单 |
| 主要安全问题 | 用户输入未经校验直接参与系统命令拼接 | 黑名单过滤不完整,且用户输入仍参与系统命令拼接 |
| 根本修复方式 | 严格校验输入并避免直接拼接系统命令 | 严格校验输入并避免直接拼接系统命令 |

浙公网安备 33010602011771号