DVWA靶场通关----(2) Command Injection教程

Command Injection(命令注入)

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

Command Injection主题:

 

Low

源码解析

<?php

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

    // 确定操作系统并执行ping命令
    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>";
} 

漏洞复现

  通过代码可以发现,服务器仅仅只是判断了不同的操作系统执行不同的命令,并没有做其他的限制

  先简单介绍一下如何使用连接符号拼接自己的命令

127.0.0.1 & ipconfig    先执行127.0.0.1,不管127.0.0.1是否执行成功都会执行ipconfig
127.0.0.1 && ipconfig    先执行127.0.0.1,127.0.0.1执行成功后才会执行ipconfig
127.0.0.1 | ipconfig    不管127.0.0.1执行是否成功都会执行ipconfig
127.0.0 || ipconfig      前面的命令要执行失败,才可以执行后面的命令

在这我们直接使用第一个  127.0.0.1 & ipconfig  就好了:

 

Medium

源码解析

<?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难度,增加了黑名单,将 "&&",";" 做了限制,将其改成空格,但是别的没有什么改变,在这里依旧可以通过  127.0.0.1 & ipconfig  来绕过

 

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

?>

漏洞复现

  看到代码,发现黑名单中的限制更多了,像 '&','| ','||',';','$' 等许多都加了限制,但是要仔细观察 ,比如说这个 '| ' ,它是在管道符后面加了个空格,因此考虑使用 127.0.0.1 |ipconfig 来绕过

 

Impossible

源码解析

<?php

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

    // Get input
    $target = $_REQUEST[ 'ip' ];
  // stripslashes函数会剥离字符串中的反斜杠,然后返回剥离完反斜杠的字符串
    $target = stripslashes( $target );

    // Split the IP into 4 octects,以.作为分隔符,分割$target
    $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.入过都是数字类型的话,就将2他们再合并成$torget
        $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();

?>

  像这种是白名单限制,相比于黑名单来说,还是比较安全的,对于这个难度的代码,兄弟们学习一下怎么写的吧。

posted @ 2021-12-18 21:42  常青园  阅读(1502)  评论(0编辑  收藏  举报