DVWA—命令执行练习
字数 1347 2025-08-19 12:41:52

DVWA命令执行漏洞教学文档

一、命令执行漏洞概述

命令执行漏洞是指应用程序未对用户输入进行充分过滤,导致攻击者能够通过构造特殊输入在服务器上执行任意系统命令的安全漏洞。

二、DVWA命令执行实验环境

DVWA(Damn Vulnerable Web Application)提供了四个安全等级的命令执行实验场景:

  1. Low级别:无任何过滤
  2. Medium级别:部分过滤
  3. High级别:严格过滤但有缺陷
  4. Impossible级别:完全防护

三、各等级详细分析

Low级别

漏洞代码分析

if(isset($_POST['Submit'])) {
    $target = $_REQUEST['ip'];
    
    if(stristr(php_uname('s'), 'Windows NT')) {
        $cmd = shell_exec('ping '.$target);
    } else {
        $cmd = shell_exec('ping -c 4 '.$target);
    }
    
    echo "<pre>{$cmd}</pre>";
}

漏洞点

  • 直接拼接用户输入$target到系统命令中
  • 无任何过滤或验证

利用方法

可以使用各种命令拼接符:

127.0.0.1; ls
127.0.0.1 && cat /etc/passwd
127.0.0.1 | netstat -an

常用命令拼接符

符号 说明
; 执行完前一个命令后执行后一个命令
& 后台执行前一个命令,然后执行后一个命令
&& 前一个命令成功才执行后一个命令
` `
`

Medium级别

漏洞代码分析

$substitutions = array(
    '&&' => '',
    ';' => '',
);

$target = str_replace(array_keys($substitutions), $substitutions, $target);

过滤措施

  • 过滤了&&;字符

绕过方法

  • 使用未被过滤的|&符号:
127.0.0.1 | whoami
127.0.0.1 & ipconfig

High级别

漏洞代码分析

$substitutions = array(
    '&' => '',
    ';' => '',
    '| ' => '',  // 注意这里有空格
    '-' => '',
    '$' => '',
    '(' => '',
    ')' => '',
    '`' => '',
    '||' => '',
);

$target = str_replace(array_keys($substitutions), $substitutions, $target);

过滤措施

  • 过滤了多种特殊字符
  • 特别注意'| '是带空格的管道符

绕过方法

  • 使用不带空格的|
127.0.0.1|uname -a

Impossible级别

防护代码分析

$target = stripslashes($target);
$octet = explode(".", $target);

if((is_numeric($octet[0])) && 
   (is_numeric($octet[1])) && 
   (is_numeric($octet[2])) && 
   (is_numeric($octet[3])) && 
   (sizeof($octet) == 4)) {
    $target = $octet[0].'.'.$octet[1].'.'.$octet[2].'.'.$octet[3];
    // 执行ping
} else {
    echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}

防护措施

  1. 使用stripslashes()去除反斜杠
  2. 将输入按.分割为四部分
  3. 验证每部分是否为数字
  4. 验证是否为合法的四段IP格式
  5. 重新拼接IP地址

四、相关PHP函数解析

1. shell_exec()

  • 执行shell命令并返回完整输出字符串
  • 类似函数比较:
    • system(): 直接输出结果
    • exec(): 返回最后一行或数组
    • passthru(): 直接输出原始结果
    • 反引号`: 与shell_exec()功能相同

2. stristr()

  • 查找字符串的首次出现
  • 语法:stristr(string $haystack, mixed $needle)

3. php_uname()

  • 获取运行PHP的操作系统信息
  • 参数:
    • 's': 操作系统名称
    • 'n': 主机名
    • 'r': 版本信息
    • 'v': 版本详情
    • 'm': 机器类型

五、防御措施总结

  1. 输入验证

    • 严格限制输入格式(如Impossible级别的IP验证)
    • 使用白名单而非黑名单
  2. 命令执行防护

    • 避免直接拼接用户输入到系统命令
    • 使用安全的API替代系统命令
  3. 其他措施

    • 使用escapeshellarg()escapeshellcmd()函数
    • 设置Web服务器以最小权限运行
    • 实施CSRF防护(如Impossible级别中的token验证)

六、实验建议

  1. 依次尝试各个安全等级,观察防护措施的演进
  2. 在Low级别尝试所有命令拼接符
  3. 在Medium和High级别尝试绕过过滤
  4. 分析Impossible级别的完整防护方案
  5. 思考在实际开发中如何应用这些防护措施

通过本实验,可以深入理解命令执行漏洞的原理、利用方式及防护方法,对提高Web应用安全性有重要意义。

DVWA命令执行漏洞教学文档 一、命令执行漏洞概述 命令执行漏洞是指应用程序未对用户输入进行充分过滤,导致攻击者能够通过构造特殊输入在服务器上执行任意系统命令的安全漏洞。 二、DVWA命令执行实验环境 DVWA(Damn Vulnerable Web Application)提供了四个安全等级的命令执行实验场景: Low级别 :无任何过滤 Medium级别 :部分过滤 High级别 :严格过滤但有缺陷 Impossible级别 :完全防护 三、各等级详细分析 Low级别 漏洞代码分析 漏洞点 直接拼接用户输入 $target 到系统命令中 无任何过滤或验证 利用方法 可以使用各种命令拼接符: 常用命令拼接符 | 符号 | 说明 | |------|------| | ; | 执行完前一个命令后执行后一个命令 | | & | 后台执行前一个命令,然后执行后一个命令 | | && | 前一个命令成功才执行后一个命令 | | | | 将前一个命令的输出作为后一个命令的输入 | | || | 前一个命令失败才执行后一个命令 | Medium级别 漏洞代码分析 过滤措施 过滤了 && 和 ; 字符 绕过方法 使用未被过滤的 | 或 & 符号: High级别 漏洞代码分析 过滤措施 过滤了多种特殊字符 特别注意 '| ' 是带空格的管道符 绕过方法 使用不带空格的 | : Impossible级别 防护代码分析 防护措施 使用 stripslashes() 去除反斜杠 将输入按 . 分割为四部分 验证每部分是否为数字 验证是否为合法的四段IP格式 重新拼接IP地址 四、相关PHP函数解析 1. shell_ exec() 执行shell命令并返回完整输出字符串 类似函数比较: system() : 直接输出结果 exec() : 返回最后一行或数组 passthru() : 直接输出原始结果 反引号 ` : 与 shell_exec() 功能相同 2. stristr() 查找字符串的首次出现 语法: stristr(string $haystack, mixed $needle) 3. php_ uname() 获取运行PHP的操作系统信息 参数: 's': 操作系统名称 'n': 主机名 'r': 版本信息 'v': 版本详情 'm': 机器类型 五、防御措施总结 输入验证 : 严格限制输入格式(如Impossible级别的IP验证) 使用白名单而非黑名单 命令执行防护 : 避免直接拼接用户输入到系统命令 使用安全的API替代系统命令 其他措施 : 使用 escapeshellarg() 或 escapeshellcmd() 函数 设置Web服务器以最小权限运行 实施CSRF防护(如Impossible级别中的token验证) 六、实验建议 依次尝试各个安全等级,观察防护措施的演进 在Low级别尝试所有命令拼接符 在Medium和High级别尝试绕过过滤 分析Impossible级别的完整防护方案 思考在实际开发中如何应用这些防护措施 通过本实验,可以深入理解命令执行漏洞的原理、利用方式及防护方法,对提高Web应用安全性有重要意义。