DVWA之命令注入漏洞

命令注入

简介:

命令注入是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用程序将不安全的用户提供的数据(表单、Cookie、HTTP表头等)传递给系统shell时,可能会产生命令注入漏洞。在进行攻击时,攻击者提供的操作系统命令通常以易受攻击的应用程序的权限执行。

产生原因:

  • web服务器没有对用户提交的参数进行有效的检测过滤
  • 操作系统允许一条语句在使用连接符和管道符后执行多条命令

 

Low级别

  • 登陆DVWA平台,选择Low级别然后进入Command Injection模块。
  • 通过页面我们可以看出这是让你输入一个IP地址然后对其进行Ping测试,因此我们先只输入一个地址观察一下。

这里我们可以看到在下方返回了对127.0.0.1进行Ping检测的内容,因此我们可以猜测这里有一个可以执行系统命令的函数,则这里可能存在命令注入漏洞,且执行的命令为Ping 输入的内容。

  • 然后我们进行测试,我们利用windows命令的连接符&&进行测试。这里我们输入127.0.0.1&&dir 

可以看见这里不仅仅返回了127.0.0.1的Ping检测信息,还返回了刚刚拼接dir命令的结果即当前目录下的文件和子目录的信息。然后我们就可以通过拼接其他命令进行攻击,达到我们的目的。

  • 然后我们查看一下Low级别的代码
​<?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 
        $cmd = shell_exec( 'ping  ' . $target ); 
    } 
    else { 
        // *nix 
        $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
    } 

    // Feedback for the end user 
    echo "<pre>{$cmd}</pre>"; 
} 

?> ​

这里我们可以看到代码果然如我们之前猜测的一样,将我们输入的值直接拼接到ping 命令后面。

在这里运用了两个函数stristr(string,search,before_search)和php_uname(mode)函数,第一个函数的作用是搜索字符串在另一字符串中的第一次出现。before_search为可选参数默认值为 "false" 的布尔值。如果设置为 "true",它将返回 search 参数第一次出现之前的字符串部分。该函数的返回值为返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回 FALSE。

第二个函数的作用是返回运行php的操作系统的相关描述,参数mode可取值

”a” (此为默认,包含序列”s n r v m”里的所有模式)

”s ”(返回操作系统名称)

”n”(返回主机名)

”r”(返回版本名称)

”v”(返回版本信息)             

 ”m”(返回机器类型)

因此这段代码的含义为判断该操作系统为哪种操作系统并按操作系统的不同执行其对应的Ping命令。

Medium级别

  • 我们同样先试一下Low级别的做法,输入127.0.0.1&&dir进行测试,发现失败了。
  • 不过windows下的管道符或者连接符不只有&&,还有以下几种:

command1&command2         无论command1是否执行成功都要执行command2

command1&&command2      只有command1执行成功后才执行command2

command1||command2         只有command1执行失败后才执行command2

command1|command2          将command1的执行结果传递给command2

  • 既然用&&连接测试失败了,我们试一下利用&进行连接,我们输入127.0.0.1进行测试,发现下方成功显示出了命令结果,则表示注入成功。
  • 那么我们来看一下代码是什么导致了这个结果。
<?php 

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

    // Set blacklist 
    $substitutions = array( 
        '&&' => '', 
        ';'  => '', 
    ); 

    // Remove any of the charactars in the array (blacklist). 
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 

    // 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>"; 
} 

?> 

这里我们可以看见先对于Low级别而言这里多了一些代码,这段代码的作用就是对输入的字符进行判断若出现‘&&’或‘;’字符则用‘’代替。这样就在一定程度上隔绝了用此类连接符连接的命令注入。这是明显的黑名单做法,可还是不能有效的阻挡命令注入。

High级别

我们在依次使用不同的连接符或管道符进行测试,我们发现只有管道符 ‘|’ 对命令进行连接才能实现测试。通过刚刚Medium级别,我们同样猜测这里应该同样的采用了黑名单的做法,不过相对于Medium级别的扩大了黑名单的内容。接下来我们看一下High级别的代码。


<?php 

if( isset( $_POST[ 'Submit' ]  ) ) { 
    // Get input 
    $target = trim($_REQUEST[ 'ip' ]); 

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

    // Remove any of the charactars in the array (blacklist). 
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 

    // 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>"; 
} 

?> 

果然如同Medium级别一样采用的是黑名单方法,并扩大了限制的字符,在一定程度上限制了命令注入,但并没有起到实际作用。

Impossible级别

我们在依次进行输入,发现任何连接符和管道符都实现不了命令注入。并下面提示

ERROR: You have entered an invalid IP.

跟之前几个级别提示的

Ping 请求找不到主机 127.0.0.1dir。请检查该名称,然后重试。

这些无法判断服务器是怎样处理输入的数据,所以这里我们就直接看一下代码。

?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]; 

        // 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(); 

?> 

我们发现这里还添加了token参数的检验,杜绝了CSRF漏洞的利用,并且这里我们发现在代码中,其限制了输入数据的格式,也就是说这里采用了白名单的做法,只有输入的格式跟白名单的一样才能通过验证,其他的都不行。这样就基本上杜绝了命令注入。

### DVWA 命令注入漏洞利用方法 对于DVWA靶场中的命令注入漏洞,在低难度设置下,攻击者可以通过向应用程序传递未经过滤或验证的输入来执行任意操作系统命令。当目标应用存在命令注入漏洞时,通常是因为开发人员未能正确处理用户提交的数据。 #### 修改字符集编码以防止乱码显示 为了确保能够正常查看通过命令注入获取的结果,可以调整DVWA页面的字符集编码。具体操作是在`DVWA-master\dvwa\includes`目录下的`dvwaPage.inc.php`文件中查找所有出现的"`charset=utf-8`"字符串,并将其更改为"`charset=gb2312`"[^1]。这一步骤有助于解决因不同编码标准之间的差异而导致可能出现的中文字符显示异常问题。 #### 利用Burp Suite进行测试 使用Burpsuite这样的工具可以帮助安全研究人员分析和篡改HTTP/HTTPS流量。在本案例中,建议先启动Burpsuite并配置浏览器代理指向该软件;之后访问DVWA平台上的命令注入模块完成一次正常的表单提交动作。此时可以在Burpsuite的历史记录里捕获到相应的POST请求包,接着把其转发至重放器(Intruder)组件做进一步修改尝试。 #### 构造恶意负载实现远程命令执行 假设当前环境允许直接拼接外部输入作为部分shell指令的一部分,则只需简单地附加想要运行的操作系统级命令即可达成目的。例如: ```bash ; ls - ``` 上述分号用于终止原有预期之外多余的部分,而后面的命令则会列出服务器根目录下的文件列表。当然实际场景下可能还需要考虑转义特殊字符等问题以便绕过某些基本防护机制。 需要注意的是,这里仅提供学习交流用途的技术细节说明,请勿非法入侵任何网络资源!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值