• DVWA学习记录 PartⅡ


    Command Injection

    1. 题目

    Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。

    Command_Injection1

    2. Low

    a. 代码分析

    <?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 { 
            // linux 
            $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
        } 
        // Feedback for the end user 
        echo "<pre>{$cmd}</pre>"; 
    } 
    ?> 
    

    stristr() 函数搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分。

    注释:该函数是二进制安全的。

    注释:该函数是不区分大小写的。如需进行区分大小写的搜索,请使用 strstr() 函数。

    php_uname ([ string $mode = "a" ] ) : string
        php_uname — 返回运行 PHP 的系统的有关信息
        'a':此为默认。包含序列 "s n r v m" 里的所有模式。
        's':操作系统名称。例如: FreeBSD。
        'n':主机名。例如: localhost.example.com。
        'r':版本名称,例如: 5.1.2-RELEASE。
        'v':版本信息。操作系统之间有很大的不同。
        'm':机器类型。例如:i386。
    

    可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。

    b. 漏洞利用

    %0a 、%0d 、; 、& 、| 、&&、||均可用来执行多条命令

    127.0.0.1&&net user

    3. Medium

    a. 代码分析

    <?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 { 
            // linux 
            $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
        } 
        // Feedback for the end user 
        echo "<pre>{$cmd}</pre>"; 
    } 
    ?>
    

    代码过滤了&&;,仍有其他符号可以使用

    b. 漏洞利用

    127.0.0.1&net user

    4. High

    a. 代码分析

    <?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级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。

    b. 漏洞利用

    黑名单看似过滤了所有的非法字符,但仔细观察到是把|(空格) 替换为空字符,于是|成了“漏网之鱼”。

    127.0.0.1|net user

    5. impossible

    a. 代码分析

    <?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 { 
                // linux 
                $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(); 
    ?> 
    

    相关函数介绍

    stripslashes(string)

    stripslashes函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。

    explode(separator,string,limit)

    把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。

    is_numeric(string)

    检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。

    可以看到,Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

  • 相关阅读:
    centos8 安装postresql12
    vs code 开启远程调试步骤
    node 版本管理器 nvs
    Vue I18n Vue.js 的国际化插件+elementUI的使用
    c#结构
    下拉菜单
    使用Convert 类和Parse方法将字符串转换为数值类型
    c# try..... catch
    c#迭代算法
    网页兼容各种浏览器
  • 原文地址:https://www.cnblogs.com/chalan630/p/12739161.html
Copyright © 2020-2023  润新知