• DVWA学习记录 PartⅥ


    Insecure CAPTCHA

    1. 题目

    Insecure CAPTCHA(全自动区分计算机和人类的图灵测试),意思是不安全的验证码。

    指在进行验证的过程中,出现了逻辑漏洞,导致验证码没有发挥其应有的作用。

    Insecure_CAPTCHA1

    Google reCAPTCHA服务验证流程:

    Insecure_CAPTCHA2

    2. Low

    a. 代码分析

    <?php 
    if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) { 
        // Hide the CAPTCHA form 
        $hide_form = true; 
    
        // Get input 
        $pass_new  = $_POST[ 'password_new' ]; 
        $pass_conf = $_POST[ 'password_conf' ]; 
    
        // Check CAPTCHA from 3rd party 
        $resp = recaptcha_check_answer( $_DVWA[ 'recaptcha_private_key' ], 
            $_SERVER[ 'REMOTE_ADDR' ], 
            $_POST[ 'recaptcha_challenge_field' ], 
            $_POST[ 'recaptcha_response_field' ] ); 
    
        // Did the CAPTCHA fail? 
        if( !$resp->is_valid ) { 
            // What happens when the CAPTCHA was entered incorrectly 
            $html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>"; 
            $hide_form = false; 
            return; 
        } 
        else { 
            // CAPTCHA was correct. Do both new passwords match? 
            if( $pass_new == $pass_conf ) { 
                // Show next stage for the user 
                echo " 
                    <pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre> 
                    <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 { 
                // Both new passwords do not match. 
                $html     .= "<pre>Both passwords must match.</pre>"; 
                $hide_form = false; 
            } 
        } 
    } 
    
    if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) { 
        // Hide the CAPTCHA form 
        $hide_form = true; 
    
        // Get input 
        $pass_new  = $_POST[ 'password_new' ]; 
        $pass_conf = $_POST[ 'password_conf' ]; 
    
        // Check to see if both password match 
        if( $pass_new == $pass_conf ) { 
            // They do! 
            $pass_new = mysql_real_escape_string( $pass_new ); 
            $pass_new = md5( $pass_new ); 
    
            // Update database 
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; 
            $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' ); 
    
            // Feedback for the end user 
            echo "<pre>Password Changed.</pre>"; 
        } 
        else { 
            // Issue with the passwords matching 
            echo "<pre>Passwords did not match.</pre>"; 
            $hide_form = false; 
        } 
    
        mysql_close(); 
    } 
    
    ?> 
    

    代码将修改密码的过程分为两步,通过step参数确定。第一步时,代码调用第三方验证码,进行人机检测,通过测试后,将数据包中step参数修改为2,重新发送数据。

    这里可以在发送数据的时候,直接将step改为2,绕过第一步中的人机检测。

    b. 漏洞利用

    Insecure_CAPTCHA3

    将step1改为2,可不通过验证修改密码。

    3. Medium

    a. 代码分析

    <?php 
    if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) { 
        // Hide the CAPTCHA form 
        $hide_form = true; 
    
        // Get input 
        $pass_new  = $_POST[ 'password_new' ]; 
        $pass_conf = $_POST[ 'password_conf' ]; 
    
        // Check CAPTCHA from 3rd party 
        $resp = recaptcha_check_answer( $_DVWA[ 'recaptcha_private_key' ], 
            $_SERVER[ 'REMOTE_ADDR' ], 
            $_POST[ 'recaptcha_challenge_field' ], 
            $_POST[ 'recaptcha_response_field' ] ); 
    
        // Did the CAPTCHA fail? 
        if( !$resp->is_valid ) { 
            // What happens when the CAPTCHA was entered incorrectly 
            $html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>"; 
            $hide_form = false; 
            return; 
        } 
        else { 
            // CAPTCHA was correct. Do both new passwords match? 
            if( $pass_new == $pass_conf ) { 
                // Show next stage for the user 
                echo " 
                    <pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre> 
                    <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="hidden" name="passed_captcha" value="true" /> 
                        <input type="submit" name="Change" value="Change" /> 
                    </form>"; 
            } 
            else { 
                // Both new passwords do not match. 
                $html     .= "<pre>Both passwords must match.</pre>"; 
                $hide_form = false; 
            } 
        } 
    } 
    if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) { 
        // Hide the CAPTCHA form 
        $hide_form = true; 
    
        // Get input 
        $pass_new  = $_POST[ 'password_new' ]; 
        $pass_conf = $_POST[ 'password_conf' ]; 
    
        // Check to see if they did stage 1 
        if( !$_POST[ 'passed_captcha' ] ) { 
            $html     .= "<pre><br />You have not passed the CAPTCHA.</pre>"; 
            $hide_form = false; 
            return; 
        } 
    
        // Check to see if both password match 
        if( $pass_new == $pass_conf ) { 
            // They do! 
            $pass_new = mysql_real_escape_string( $pass_new ); 
            $pass_new = md5( $pass_new ); 
    
            // Update database 
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; 
            $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' ); 
    
            // Feedback for the end user 
            echo "<pre>Password Changed.</pre>"; 
        } 
        else { 
            // Issue with the passwords matching 
            echo "<pre>Passwords did not match.</pre>"; 
            $hide_form = false; 
        } 
        mysql_close(); 
    } 
    ?> 
    

    与low级别相比,增加了一个参数passed_captcha

    b. 漏洞利用

    在发送数据包的时候,手动添加passed_captcha参数。

    Insecure_CAPTCHA4

    4. High

    a. 代码分析

    <?php
    if( isset( $_POST[ 'Change' ] ) ) {
        // Hide the CAPTCHA form
        $hide_form = true;
    
        // Get input
        $pass_new  = $_POST[ 'password_new' ];
        $pass_conf = $_POST[ 'password_conf' ];
    
        // Check CAPTCHA from 3rd party
        $resp = recaptcha_check_answer(
            $_DVWA[ 'recaptcha_private_key' ],
            $_POST['g-recaptcha-response']
        );
        if (
            $resp || 
            (
                $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3'
                && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA'
            )
        ){
            // CAPTCHA was correct. Do both new passwords match?
            if ($pass_new == $pass_conf) {
                $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
                $pass_new = md5( $pass_new );
                // Update database
                $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";
                $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
    
                // Feedback for user
                echo "<pre>Password Changed.</pre>";
    
            } else {
                // Ops. Password mismatch
                $html     .= "<pre>Both passwords must match.</pre>";
                $hide_form = false;
            }
    
        } else {
            // What happens when the CAPTCHA was entered incorrectly
            $html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
            $hide_form = false;
            return;
        }
    
        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    // Generate Anti-CSRF token
    generateSessionToken();
    ?>
    

    可以看到,服务器的验证逻辑是当$resp(这里是指谷歌返回的验证结果)是false,并且参数recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查。

    b. 漏洞利用

    手动添加所需要的参数:

    Insecure_CAPTCHA5

    5. impossible

    a. 代码分析

    if( isset( $_POST[ 'Change' ] ) ) { 
        // Check Anti-CSRF token 
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
    
        // Hide the CAPTCHA form 
        $hide_form = true; 
    
        // Get input 
        $pass_new  = $_POST[ 'password_new' ]; 
        $pass_new  = stripslashes( $pass_new ); 
        $pass_new  = mysql_real_escape_string( $pass_new ); 
        $pass_new  = md5( $pass_new ); 
    
        $pass_conf = $_POST[ 'password_conf' ]; 
        $pass_conf = stripslashes( $pass_conf ); 
        $pass_conf = mysql_real_escape_string( $pass_conf ); 
        $pass_conf = md5( $pass_conf ); 
    
        $pass_curr = $_POST[ 'password_current' ]; 
        $pass_curr = stripslashes( $pass_curr ); 
        $pass_curr = mysql_real_escape_string( $pass_curr ); 
        $pass_curr = md5( $pass_curr ); 
    
        // Check CAPTCHA from 3rd party 
        $resp = recaptcha_check_answer( $_DVWA[ 'recaptcha_private_key' ], 
            $_SERVER[ 'REMOTE_ADDR' ], 
            $_POST[ 'recaptcha_challenge_field' ], 
            $_POST[ 'recaptcha_response_field' ] ); 
    
        // Did the CAPTCHA fail? 
        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 { 
            // Check that the current password is correct 
            $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); 
            $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); 
            $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); 
            $data->execute(); 
    
            // Do both new password match and was the current password correct? 
            if( ( $pass_new == $pass_conf) && ( $data->rowCount() == 1 ) ) { 
                // Update the database 
                $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); 
                $data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); 
                $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); 
                $data->execute(); 
    
                // Feedback for the end user - success! 
                echo "<pre>Password Changed.</pre>"; 
            } 
            else { 
                // Feedback for the end user - failed! 
                echo "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>"; 
                $hide_form = false; 
            } 
        } 
    } 
    // Generate Anti-CSRF token 
    generateSessionToken(); 
    ?> 
    

    代码增加了Anti-CSRF token 机制防御CSRF攻击,利用PDO技术防护sql注入,验证不再分成两部分,验证码无法绕过,同时要求用户输入之前的密码,进一步加强了身份认证。

  • 相关阅读:
    chrome扩展程序开发之在目标页面运行自己的JS
    微信JSSDK接口,previewImage
    js加减乘除丢失精度
    java jdbc/ojdbc 链接oracle的三种方式
    Navicat 提示Cannot create oci environment 解决方案
    jquery ajax 回调函数
    时间日期标识符
    SSIS从理论到实战,再到应用
    Business Intelligence——SSIS项目从创建到部署的简单总结(二)
    Business Intelligence——SSIS项目从创建到部署的简单总结(一)
  • 原文地址:https://www.cnblogs.com/chalan630/p/12780724.html
Copyright © 2020-2023  润新知