• DVWA-6.4 Insecure CAPTCHA(不安全的验证码)-Impossible


    Impossible Level

    查看源码

    <?php
    
    if( isset( $_POST[ 'Change' ] ) ) {
        // Check Anti-CSRF token----token验证
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    
        // Hide the CAPTCHA form
        $hide_form = true;
    
        // Get input----对输入进行过滤、转义、md5
        $pass_new  = $_POST[ 'password_new' ];
        $pass_new  = stripslashes( $pass_new );
        $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 );
    
        $pass_conf = $_POST[ 'password_conf' ];
        $pass_conf = stripslashes( $pass_conf );
        $pass_conf = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_conf ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_conf = md5( $pass_conf );
    
        $pass_curr = $_POST[ 'password_current' ];
        $pass_curr = stripslashes( $pass_curr );
        $pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_curr = md5( $pass_curr );
    
        // Check CAPTCHA from 3rd party----第三方校验验证码
        $resp = recaptcha_check_answer(
            $_DVWA[ 'recaptcha_private_key' ],
            $_POST['g-recaptcha-response']
        );
    
        // Did the CAPTCHA fail?----第一步:如果第三方校验验证码正确,进行下一步
        if( !$resp ) {
            // What happens when the CAPTCHA was entered incorrectly
            $html .= "<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!
                $html .= "<pre>Password Changed.</pre>";
            }
            else {
                // Feedback for the end user - failed!
                $html .= "<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();
    
    ?>

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

  • 相关阅读:
    VMware Workstation 15 安装教程
    Kail更新源、输入法、浏览器
    Kali Linux 下载、引导、安装
    dwr超时
    jsp获取web的跟路径
    java线程安全
    jsp快速回顾
    在web.xml中可以设置jsp标签吗?
    axis2--生成的wsdl文件方法的参数问题
    java删除文件
  • 原文地址:https://www.cnblogs.com/zhengna/p/12766179.html
Copyright © 2020-2023  润新知