DVWA学习-Insecure CAPTCHA-Level Low

Insecure CAPTCHA

不安全的验证码

这个题目最近几天做不了,因为验证码需要使用Google验证码,客户端这边还好说,可以挂个代理得到,服务器却怎么都连接不到Google的服务器,所以干脆看代码分析漏洞吧!

代码如下所示:

<?php 

if( isset( $_POST['Change'] ) && ( $_POST['step'] == '1' ) ) { 
     
    $hide_form = true; 
    $user = $_POST['username']; 
    $pass_new = $_POST['password_new']; 
    $pass_conf = $_POST['password_conf']; 
    $resp = recaptcha_check_answer ($_DVWA['recaptcha_private_key'], 
        $_SERVER["REMOTE_ADDR"], 
        $_POST["recaptcha_challenge_field"], 
        $_POST["recaptcha_response_field"]); 

    if (!$resp->is_valid) { 
        // What happens when the CAPTCHA was entered incorrectly 
        echo "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>"; 
        $hide_form = false; 
        return;     
    } else { 
            if (($pass_new == $pass_conf)){ 
            echo "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes. <br /></pre>"; 
            echo " 
            <form action=\"#\" method=\"POST\"> 
                <input type=\"hidden\" name=\"step\" value=\"2\" /> 
                <input type=\"hidden\" name=\"password_new\" value=\"" . $pass_new . "\" /> 
                <input type=\"hidden\" name=\"password_conf\" value=\"" . $pass_conf . "\" /> 
                <input type=\"submit\" name=\"Change\" value=\"Change\" /> 
            </form>"; 
            }     

            else{ 
                    echo "<pre> Both passwords must match </pre>"; 
            $hide_form = false; 
            } 
    } 
} 

if( isset( $_POST['Change'] ) && ( $_POST['step'] == '2' ) )  
{ 
    $hide_form = true; 
        if ($pass_new != $pass_conf) 
        { 
                echo "<pre><br />Both passwords must match</pre>"; 
        $hide_form = false; 
                return; 
        } 
        $pass = md5($pass_new); 
        if (($pass_new == $pass_conf)){ 
               $pass_new = mysql_real_escape_string($pass_new); 
               $pass_new = md5($pass_new); 

               $insert="UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; 
               $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); 

               echo "<pre> Password Changed </pre>"; 
               mysql_close(); 
        } 

        else{ 
               echo "<pre> Passwords did not match. </pre>"; 
        } 
} 

?>

通过分析以上代码,发现一个很明显的漏洞,修改密码分为两个步骤,step1和step2,正常流程是用户输入账号密码和验证码,验证通过后被定向到step2,但step2并未对是否由step1过来,因此也就可以绕过step1,直接访问step2,这样也就绕过了验证码的验证,因此验证码也就没有任何作用了。

DVWA-captcha

 

 

通过截取数据包发现,修改请求通过POST方法提交,而且其中带有step参数,因此可直接将step修改为2,提交相应的参数即可。

DVWA-captcha1修改成功!

DVWA-captcha2

 

DVWA学习-CSRF-Level Low

 Cross Site Request Forgery (CSRF)

译作跨站请求伪造

这个实验都不需要做了,因为只要更改一下密码就能很容易看到该实验将会有多么的简单,修改密码的请求是通过GET方法提交的,因此,简单的不能再简单了,不具体说了

DVWA-CSRF

 

<?php 
                 
    if (isset($_GET['Change'])) { 
     
        // Turn requests into variables 
        $pass_new = $_GET['password_new']; 
        $pass_conf = $_GET['password_conf']; 


        if (($pass_new == $pass_conf)){ 
            $pass_new = mysql_real_escape_string($pass_new); 
            $pass_new = md5($pass_new); 

            $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; 
            $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); 
                         
            echo "<pre> Password Changed </pre>";         
            mysql_close(); 
        } 
     
        else{         
            echo "<pre> Passwords did not match. </pre>";             
        } 

    } 
?>

此处的代码非常简单易懂,同时可以分析到,UPDATE处将参数直接代入到了SQL语句中,同样存在漏洞,可以构造SQL语句修改任何人的密码。

"UPDATE `users` SET password = '$pass_new' WHERE user = 'admin'

将上面的代码修改为

"UPDATE `users` SET password = '123' where user='root'#' WHERE user = 'admin'

即,密码为 123′ where user=’root’#,这样就可以修改root用户的口令了,这个没有测试,因为系统里只有一个admin账号,理论可行。

DVWA学习-Command Execution-Level Low

Command Execution

译作命令执行

dvwa-Command Execution

该题目非常简单,即在输入框本应该输入IP或者域名执行ping,但是由于没有做足够的限制,导致用户可以任意构造该命令。

代码如下所示:

<?php 

if( isset( $_POST[ 'submit' ] ) ) { 

    $target = $_REQUEST[ 'ip' ]; 

    // Determine OS and execute the ping command. 
    if (stristr(php_uname('s'), 'Windows NT')) {  
     
        $cmd = shell_exec( 'ping  ' . $target ); 
        echo '<pre>'.$cmd.'</pre>'; 
         
    } else {  
     
        $cmd = shell_exec( 'ping  -c 3 ' . $target ); 
        echo '<pre>'.$cmd.'</pre>'; 
         
    } 
     
} 
?>

$cmd shell_exec‘ping  -c 3 ‘ $target ); 

此处的代码未对$_REQUEST[ ‘ip’ ];做任何的处理,并赋值给$target,导致$target可被用户任意控制,因此可以进行构造,执行任意系统命令。

DVWA学习-Brute Force-Level Low

Brute Force

在这里理解为暴力破解,也有译作蛮力攻击的。

dvwa-Brute Force

 

输入一个账号密码,通过Burpsuit拦截包,可以看到用户名和密码是通过GET方法进行提交,如下图所示:

dvwa-Brute Force1

 

因此可以进行暴力猜解,当然使用Burpsuit的暴力猜解功能即可。在Proxy的History中右击该请求,发送到Intruder即可,在Intruder中设定账号和密码来进行暴力猜解。

最后得到账号密码 admin admin

猜解完成!输入框下方提示【 Welcome to the password protected area admin 】

<?php 

if( isset( $_GET['Login'] ) ) { 

    $user = $_GET['username']; 
     
    $pass = $_GET['password']; 
    $pass = md5($pass); 

    $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';"; 
    $result = mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' ); 

    if( $result && mysql_num_rows( $result ) == 1 ) { 
        // Get users details 
        $i=0; // Bug fix. 
        $avatar = mysql_result( $result, $i, "avatar" ); 

        // Login Successful 
        echo "<p>Welcome to the password protected area " . $user . "</p>"; 
        echo '<img src="' . $avatar . '" />'; 
    } else { 
        //Login failed 
        echo "<pre><br>Username and/or password incorrect.</pre>"; 
    } 

    mysql_close(); 
} 

?>

页面核心代码如上所示

通过代码审计发现,该页面代码不仅存在暴力猜解的问题,同时还有SQL注入漏洞;参数username被直接赋值给$user代入到了SQL语句中执行,这样就产生了SQL注入漏洞,但是下面的代码又验证了返回的结果必须为一行,因此可以使用limit控制返回的行数,因此可以构造SQL注入的用户名

admin' or 1=1 limit 1#

密码任意即可成功登陆!

如下图所示:

dvwa-Brute Force2