zoukankan      html  css  js  c++  java
  • DVWA-6.3 Insecure CAPTCHA(不安全的验证码)-High

    High Level

    查看源码

    <?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
                $html .= "<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(这里是指谷歌返回的验证结果)是true,或者  参数g-recaptcha-response等于hidd3n_valu3并且http包头的User-Agent参数等于reCAPTCHA 时,就认为验证码输入正确,通过了验证码的检查。

    漏洞利用

    搞清楚了验证逻辑,剩下就是伪造绕过了,由于$resp参数我们无法控制,所以重心放在参数g-recaptcha-responseUser-Agent上。

    第一步依旧是抓包:

    更改参数g-recaptcha-response以及http包头的User-Agent:

    密码修改成功:

    参考:https://www.freebuf.com/articles/web/119692.html 

  • 相关阅读:
    .net remoting 事件调用循环处理中重复返回的问题.
    MySQL5.7.29winx64解压缩版安装
    IntelliJ IDEA下SVN的配置及使用说明
    navicat12.0.26如何激活
    sql优化的几种方式
    mysql导入文件出现Data truncated for column 'xxx' at row 1的原因
    MessageFormat.format()用法
    idea提交svn不显示新建文件
    后端Long类型传到前端精度丢失的正确解决方式
    在IDEA中的cannot_resolve_method解决方法
  • 原文地址:https://www.cnblogs.com/zhengna/p/12766123.html
Copyright © 2011-2022 走看看