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 模块。
image

2. 观察模块正常功能

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

3. 使用Burp Suite进行抓包分析

开启Burp Suite Proxy模块进行拦截,提交一次正常请求。
image

三 手工黑盒测试

1. 使用Repeater模块

右键将正常请求发送到 Burp Suite Repeater。
image

2. 测试命令

127.0.0.1;whoami 发现返回空白。
image
127.0.0.1&&whoami 发现返回ping结果但无whoami结果,与本身命令相矛盾。
image
经查资料,&是POST参数分隔符,并未被当成命令执行,因此进行URL编码为%26 观察返回结果,为空白。
image
127.0.0.1||whoami返回ping结果,符合本身命令。
image
127.0.0.1|whoami 返回whoami结果。
image
127.0.0.1&whoami转为127.0.0.1%26whoami 发现whoami结果在ping第一个和第二个结果之间,符合本身命令。
image
结合这些测试结果,得出结论;&&被过滤。

四 代码审计

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 命令
; 命令连接符 可直接利用 被过滤
&& 命令连接符 可直接利用 被过滤
& 命令连接符 可利用 未过滤,仍可利用
| 管道符 可利用 未过滤,仍可利用
命令注入漏洞 存在 仍然存在
主要防护措施 无明显防护 增加部分危险字符黑名单
主要安全问题 用户输入未经校验直接参与系统命令拼接 黑名单过滤不完整,且用户输入仍参与系统命令拼接
根本修复方式 严格校验输入并避免直接拼接系统命令 严格校验输入并避免直接拼接系统命令
posted @ 2026-07-27 14:39  网安新手  阅读(15)  评论(0)    收藏  举报