DVWA-命令执行


title: DVWA-命令执行
date: 2018-10-19 13:41:23
tags: [DVWA]
categories: DVWA


DVWA的第二个漏洞模块是命令注入,即我们常说的命令执行。

漏洞原理

一些web网站因为某些功能需要执行系统命令,并通过网页传送参数到后台执行,但是并没有对用户的输入进行检测,由于没有限制用户的输入,用户便可以构造一些恶意的命令或代码使后台执行。

LOW

Low Command Injection Source

 {$cmd}
"; } ?>

代码分析

$target = $_REQUEST[ 'ip' ];

服务器通过 来获取用户在网页提交的输入,然后确定服务器的操作系统之后就执行ping命令。在执行用户的输入之前服务器并没有对用户的输入做一些限制,也没有对提交的值做一些过滤。以至于用户可以通过输入来执行其他命令。

判断操作系统

用户通过if( stristr( php_uname( 's' ), 'Windows NT' ) 来判断服务器的系统是Windows还是Linux。php_uname('s')会返回运行php的操作系统的名称,即Windows或Linux,stristr()函数则会搜索php_mod()函数的返回结果有没有在字符串中出现,如果出现了,那么操作系统是windows的,如果没有出现就是Linux。如果是windows直接ping,如果是Linux直接也就是发送4次ping之后停止,因为Linux下不加会一直ping

漏洞利用

在Linux系统和windows系统中,&&、||等可以执行多条命令,当然在Linux下还可以用分号(;)同时执行多条命令。
mark

在这里我们也可以执行其他命令,比如创建用户,加入管理员组等。

Medium

Medium Command Injection Source

 '',
        ';'  => '',
    );

    // 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 "
{$cmd}
"; } ?>

代码分析与漏洞利用

中级的源码中把逻辑与(&&)和分号(;)加入了黑名单,但我们都知道在防止攻击的时候黑名单是最不全面的,这里虽然把&&和分号;加入了黑名单,但是我们还可以用逻辑或(||)、管道符(|)或(&)来命令执行
mark

用逻辑或(||)执行时必须让前一条命令执行错误时后一条命令
mark

High

High Command Injection Source

 '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // 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 "
{$cmd}
"; } ?>

代码分析和漏洞利用

我们很容易看到高级的黑名单比中级的限制的字符要多,高级的黑名单把'&',';','| ','-','$','(',')','`','||'这些符号都过滤了。

但是我们注意到他过滤了逻辑或(||)和管道符+空格(| ),而并不是直接过滤的管道符,因此我们可以用管道符来命令执行。如图。
mark

Impossible

代码分析

{$cmd}
"; } else { // Ops. Let the user name theres a mistake echo '
ERROR: You have entered an invalid IP.
'; } } // Generate Anti-CSRF token generateSessionToken(); ?>

代码分析

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

代码中Anti-CSRF token是用来防范CSRF攻击的。客户端每次随机生成一个token,用户提交的时候会携带token到服务器端,在服务器端的对比,正确就验证通过,不正确就丢弃。

$target = stripslashes( $target );

stripslashes()函数对获取的用户的输入target字符串中的反斜杠删除,返回删除发斜杠后的字符串。

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

explode()函数把字符串打散成数组。获取的用户输入的IP地址,通过"."进行分割,分割成数组。

// 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()函数用于检测变量是否为数字或数字字符串。sizeof()函数返回数组中元素的数目。

这段代码对分割成数组的字符串进行判断,如果数组的每一个元素都是数字类型,且数组的元素个数为4,即输入的格式为点分十进制ip,就把所有的数字用“.”进行拼接然后执行ping操作,从而避免了命令执行漏洞。


下面给大家补充一下连接符的区别

连接符的区别

  1. “&&”逻辑与:&&符号连接的命令只有在前一条命令成功执行后才执行后面的命令,如果前一条命令执行失败,那么后一条命令不执行
    mark
  2. “&”后台任务符号:&放在命令后标志设置此进程为后台进程,如下图echo 1和echo 2都为后台执行任务,而echo 3为前台执行任务,在前台执行任务结束后会得到一个shell提示符,前台任务可能执行完也可能未执行完。一条命令执行失败并不影响其他命令执行,而且执行的先后顺序也不一定。
    mark
  3. “||”逻辑或:前一条命令执行失败后才执行后一条命令,只要有一条命令执行成功就不再执行后面的命令。
    mark
  4. "|"管道符号:将前一个命令的标准输出重定向到后一个命令的标准输入如cat test.txt|grep admin。当后一个不能接受标准输入时,前一个命令的标准输出无法管道成功,如果最后一个命令能正确执行,则输出最后一个命令的执行结果,若最好一个命令执行错误则直接报错。
    mark
  5. “;”分号:在Linux系统下分号连接的命令依次执行,前一条命令执行错误并不影响后一条命令执行。但在Windows系统下不行。
    mark
    mark

你可能感兴趣的:(DVWA-命令执行)