DVWA-Command Injection(命令注入)

命令注入是通过提交含有恶意的服务器端可以执行命令,且这些命令能被服务器执行,从而能间接操作服务器。

DVWA的Command Injection 级别分为:

  --low

  --medium

  --high

  --impossible

--low级别

看以下,正常的操作是输入IP地址,交由服务器进行ping操作,然后再将结果返回给前端展示。

 服务器端代码:

<?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参数后,判断当前服务器类型,如果是windows则直接拼接ip参数,然后执行ping命令,如果否则拼接ping -c 4的命令,没有针对&& || 字符进行转化,那么尝试用&& || 连接符拼接其他命令,看能不能执行。

 

命令查看当前文件及权限信息:123 || ls -l

 命令查看环境变量信息:127.0.0.1 && echo $PATH

 查看进程信息:127.0.0.1 && ps auxf

 

 

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

?>

medium级别中,已经通过str_replace()函数将&&和;符号转换为空。但是用&;&转换后是不是又变成了:&& 符号了,或者用单个& 是不是还是能执行,尝试一下看看。

 

查看服务器的ip127.0.0.1 &;& ip addr

看来还是能执行:&;& 后面的命令。

再试试单个& 符号,查看进程看看:

 

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

?>

high级别中,开始对所有可以拼接的字符进行替换,但是由于疏忽在“|”后面多加了一个空格符,导致原本是要将|为空, 变成将了| 替换为空,导致最终还是能用|” 或“||”来拼接后面的命令。下面尝试一下,看是不是猜测的。

查看文件信息命令:127.0.0.1 || ls -l .

可以看到还是可以执行双竖线||后面的命令。

在试试&&后面的命令是不是已经被过滤掉了。

在试试将high中的| ”后面的空格去掉,看看双竖线后面的命令是不是也被替换掉了。

编辑/var/www/html/vulnerabilities/exec/sourcehigh.php,去掉| ”后面的空格符。

在页面【View Source】查看源码,已经将竖线|”后面的空格去掉

 在试一下,上面查看文件信息的命令:127.0.0.1 || ls -l .

可以看到再去掉|”后面的空格符后,命令:127.0.0.1 || ls -l .  已经无法查询到当前目录下的文件信息了,说明虽然已经加上了对竖线的过滤,

但是由于编写的不严谨,导致其中的某些特殊字符在过滤中失效了,还是会存在风险隐患。

 

posted @ 2024-02-14 22:08  西夏一品唐  阅读(97)  评论(0编辑  收藏  举报