美文网首页
DVWA-命令执行

DVWA-命令执行

作者: ch3nie | 来源:发表于2019-04-03 15:50 被阅读0次

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


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

    漏洞原理

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

    LOW

    Low Command Injection Source

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

    代码分析

    $target = $_REQUEST[ 'ip' ];
    

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

    判断操作系统

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

    漏洞利用

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

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

    Medium

    Medium Command Injection Source

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

    代码分析与漏洞利用

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

    High

    High Command Injection Source

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

    代码分析和漏洞利用

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

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

    Impossible

    代码分析

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

    代码分析

    // 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. "|"管道符号:将前一个命令的标准输出重定向到后一个命令的标准输入如<u>cat test.txt|grep admin</u>。当后一个不能接受标准输入时,前一个命令的标准输出无法管道成功,如果最后一个命令能正确执行,则输出最后一个命令的执行结果,若最好一个命令执行错误则直接报错。 mark
    5. “;”分号:在Linux系统下分号连接的命令依次执行,前一条命令执行错误并不影响后一条命令执行。但在Windows系统下不行。 mark mark

    相关文章

      网友评论

          本文标题:DVWA-命令执行

          本文链接:https://www.haomeiwen.com/subject/hoszbqtx.html