DVWA关卡2:Command Injection(命令注入漏洞)

目录

Low

Medium

high

Impossible


命令注入(Command Injection),是指在某些需要输入数据的位置,还构造了恶意的代码破坏了原先的语句结构。而系统缺少有效的过滤,最终达到破坏数据、信息泄露甚至掌控电脑的目的。许多内容管理系统CMS存在命令注入漏洞。

判断命令注入流程:

是否调用系统命令
函数或函数的参数是否可控
是否拼接注入命令

命令连接符

command1 && command2:&&表示先执行command1,执行成功后执行command 2,否则不执行command 2 ;        
command1 & command2:&表示先执行command 1,不管是否成功,都会执行command 2;        
command1 || command2:||表示先执行command1,执行失败后,执行command2;        
command1 | command2:|表示将command 1的输出作为command 2的输入,只打印command 2执行的结果。以上连接符在windows和linux环境下都支持。

Low

源码:

{$cmd}
"; } ?>

从源码可以看出low级别的代码接收了用户输入的ip,然后根据服务器是否是Windows NT系统,对目标ip进行不同的ping测试。但是这里对用户的输入并没有进行过滤,所以这里便可以进行命令注入漏洞的利用:

首先可以输入127.0.0.1进行提交,查看结果:

DVWA关卡2:Command Injection(命令注入漏洞)_第1张图片

 然后利用命令连接符进行命令的拼接,分别输入127.0.0.1|ipconfig查看本地的ipconfig和127.0.0.1&net user查看本地用户信息:

DVWA关卡2:Command Injection(命令注入漏洞)_第2张图片

 DVWA关卡2:Command Injection(命令注入漏洞)_第3张图片

 发现都可以执行成功,因此便可以利用此漏洞进行更多的操作,这里便不一一介绍。

Medium

源码:

 '',
        ';'  => '',
    );

    // 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 "
{$cmd}
"; } ?>

从源码可以看出相对于low关卡来说,此关卡只是增加了&&和;的过滤,但是对其他的命令连接符得使用并没有影响,因此漏洞还是可以以相同的方式利用,127.0.0.1|ipconfig和127.0.0.1&net user的结果还是一样。

high

源码:

 '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // 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 "
{$cmd}
"; } ?>

此关卡增加了更多字符的过滤,使得大部分连接符不能使用,但是细心的童鞋会发现,对于|这个符号,源码只是对“| ”进行过滤,并没有对“|”进行过滤,因此可以利用地点来进行漏洞的利用:

DVWA关卡2:Command Injection(命令注入漏洞)_第4张图片

 可以看出High级别的代码进行了黑名单过滤,把一些常见的命令连接符进行了过滤。黑名单过滤看似安全,但是如果黑名单不全是话,是很容易进行绕过。

Impossible

{$cmd}
"; } else { // Ops. Let the user name theres a mistake echo '
ERROR: You have entered an invalid IP.
'; } } // Generate Anti-CSRF token generateSessionToken(); ?>

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

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

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

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

因此impossible也是给我们提供了防护命令注入的有效方法。

你可能感兴趣的:(DVWA渗透测试靶场,安全,web安全,网络安全)