DVWA下的命令注入通关
字数 1734 2025-08-15 21:32:24

命令注入攻击详解与DVWA通关指南

一、命令注入攻击概述

命令注入攻击(Command Injection)是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。

主要特点

  • 最常见于PHP应用程序
  • 主要原因是程序员使用具有命令执行功能的函数时未严格过滤用户输入
  • 攻击者可借此写入PHP后门文件,实施进一步渗透

二、常见命令连接符

在命令注入攻击中,连接符用于将恶意命令与原始命令结合:

连接符 作用描述 适用系统
command1 && command2 先执行command1,成功后再执行command2 Windows/Linux
`command1 command2` 只执行command2,将command1的输出作为command2的输入
command1 & command2 先执行command2,再执行command1 Windows/Linux
command1 ; command2 依次执行command1和command2 主要在Linux
`command1 command2`

三、DVWA命令注入关卡分析

1. 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 && ipconfig
  • 127.0.0.1 | netstat -an
  • 127.0.0.1 & whoami

2. Medium级别

源代码分析:

$substitutions = array( '&&' => '', ';' => '' );
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

防护措施:

  • 过滤了&&;字符
  • 使用str_replace进行简单替换

绕过方法:

  • 使用未被过滤的连接符如&|
  • 示例:
    • 127.0.0.1 & ipconfig
    • 127.0.0.1 | dir

3. High级别

源代码分析:

$substitutions = array(
    '&'  => '',
    ';'  => '',
    '| ' => '',
    '-'  => '',
    '$'  => '',
    '('  => '',
    ')'  => '',
    '`'  => '',
    '||' => ''
);

防护措施:

  • 扩展了黑名单,包含更多特殊字符
  • 仍然使用str_replace进行替换

绕过方法:

  • 发现|后不加空格的情况未被过滤
  • 示例:
    • 127.0.0.1|ipconfig (注意没有空格)
    • 127.0.0.1|dir

4. 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];
    
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        $cmd = shell_exec( 'ping ' . $target );
    } else {
        $cmd = shell_exec( 'ping -c 4 ' . $target );
    }
    
    echo "<pre>{$cmd}</pre>";
} else {
    echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}

防护措施:

  1. 使用stripslashes去除反斜杠
  2. 将输入按点号分割为四部分
  3. 严格验证每部分是否为数字
  4. 验证总共有四部分
  5. 重新拼接IP地址
  6. 添加CSRF防护

防护效果:

  • 完全阻止命令注入
  • 只接受格式正确的IP地址
  • 所有特殊字符都无法注入

四、防御命令注入的最佳实践

  1. 输入验证

    • 使用白名单而非黑名单
    • 严格限制输入格式(如Impossible级别的IP验证)
  2. 使用安全函数

    • 避免直接使用shell_exec()system()等函数
    • 使用escapeshellarg()escapeshellcmd()处理参数
  3. 最小权限原则

    • Web服务器进程应以最低必要权限运行
  4. 参数化调用

    • 将命令与参数分离,避免拼接
    • 使用数组形式传递参数
  5. 其他措施

    • 禁用危险函数(disable_functions)
    • 实施CSRF防护(如Impossible级别所示)

五、实际应用中的注意事项

  • 命令注入漏洞在实际中较为少见,因为需要应用直接执行系统命令
  • 相比SQL注入、XSS等漏洞,命令注入的通用性较低
  • 但一旦存在,危害极大,相当于获得系统shell
  • 练习时可在本地cmd中测试命令连接符的效果

六、总结

命令注入是一种高危漏洞,防御关键在于:

  1. 永远不要信任用户输入
  2. 使用严格的输入验证
  3. 避免直接拼接命令与用户输入
  4. 实施多层防御措施

通过DVWA的四个级别,我们看到了从完全无防护到完善防护的演进过程,理解这些原理对于开发安全的Web应用至关重要。

命令注入攻击详解与DVWA通关指南 一、命令注入攻击概述 命令注入攻击(Command Injection)是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。 主要特点 最常见于PHP应用程序 主要原因是程序员使用具有命令执行功能的函数时未严格过滤用户输入 攻击者可借此写入PHP后门文件,实施进一步渗透 二、常见命令连接符 在命令注入攻击中,连接符用于将恶意命令与原始命令结合: | 连接符 | 作用描述 | 适用系统 | |--------|----------|----------| | command1 && command2 | 先执行command1,成功后再执行command2 | Windows/Linux | | command1 | command2 | 只执行command2,将command1的输出作为command2的输入 | Windows/Linux | | command1 & command2 | 先执行command2,再执行command1 | Windows/Linux | | command1 ; command2 | 依次执行command1和command2 | 主要在Linux | | command1 || command2 | 当command1执行失败时执行command2 | Windows/Linux | 三、DVWA命令注入关卡分析 1. Low级别 源代码分析: 漏洞特征: 直接拼接用户输入( $target )到系统命令中 没有任何过滤或限制措施 所有命令连接符均可使用 攻击示例: 127.0.0.1 && ipconfig 127.0.0.1 | netstat -an 127.0.0.1 & whoami 2. Medium级别 源代码分析: 防护措施: 过滤了 && 和 ; 字符 使用 str_replace 进行简单替换 绕过方法: 使用未被过滤的连接符如 & 或 | 示例: 127.0.0.1 & ipconfig 127.0.0.1 | dir 3. High级别 源代码分析: 防护措施: 扩展了黑名单,包含更多特殊字符 仍然使用 str_replace 进行替换 绕过方法: 发现 | 后不加空格的情况未被过滤 示例: 127.0.0.1|ipconfig (注意没有空格) 127.0.0.1|dir 4. Impossible级别 源代码分析: 防护措施: 使用 stripslashes 去除反斜杠 将输入按点号分割为四部分 严格验证每部分是否为数字 验证总共有四部分 重新拼接IP地址 添加CSRF防护 防护效果: 完全阻止命令注入 只接受格式正确的IP地址 所有特殊字符都无法注入 四、防御命令注入的最佳实践 输入验证 使用白名单而非黑名单 严格限制输入格式(如Impossible级别的IP验证) 使用安全函数 避免直接使用 shell_exec() 、 system() 等函数 使用 escapeshellarg() 或 escapeshellcmd() 处理参数 最小权限原则 Web服务器进程应以最低必要权限运行 参数化调用 将命令与参数分离,避免拼接 使用数组形式传递参数 其他措施 禁用危险函数( disable_functions ) 实施CSRF防护(如Impossible级别所示) 五、实际应用中的注意事项 命令注入漏洞在实际中较为少见,因为需要应用直接执行系统命令 相比SQL注入、XSS等漏洞,命令注入的通用性较低 但一旦存在,危害极大,相当于获得系统shell 练习时可在本地cmd中测试命令连接符的效果 六、总结 命令注入是一种高危漏洞,防御关键在于: 永远不要信任用户输入 使用严格的输入验证 避免直接拼接命令与用户输入 实施多层防御措施 通过DVWA的四个级别,我们看到了从完全无防护到完善防护的演进过程,理解这些原理对于开发安全的Web应用至关重要。