DVWA Insecure CAPTCHA 通关解析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云解析DNS,个人版 1个月
简介: DVWA Insecure CAPTCHA 通关解析

前言

DVWA代表Damn Vulnerable Web Application,是一个用于学习和练习Web应用程序的开源应用程序。它被设计成一个易于安装和配置的应用程序,旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序。


DVWA提供了一系列的场景和练习环境,用户可以通过这些场景来学习和实践利用技术。这些包括常见的安全问题,如SQL注入、跨站脚本(XSS)、文件包含等。通过这些,用户可以了解的原理、影响和防御方法。


DVWA提供了不同的安全级别,从低到高,以满足不同技能水平的用户需求。用户可以根据自己的能力选择适当的安全级别,并进行相应的练习和挑战。


DVWA还提供了一些额外的功能和工具,如Web代理、密码破解、弱密码检测等,以帮助用户更好地理解和处理问题。


总之,DVWA是一个用于学习和练习Web应用程序的开源应用程序。它提供了一系列的场景和练习环境,帮助安全专业人员和爱好者提高对Web应用程序安全的理解和实践能力。通过使用DVWA,用户可以加深对Web应用程序的认识,并学习如何有效地保护Web应用程序免受。

介绍

Insecure CAPTCHA(不安全的验证码)指的是那些在设计和实现上存在安全的验证码系统,这些可以被利用,以绕过验证机制。验证码(CAPTCHA,全称 Completely Automated Public Turing test to tell Computers and Humans Apart)是一种用来区分人类用户和自动化程序(如脚本和机器人)的方法。尽管验证码被广泛用于防止自动化攻击,如、垃圾信息提交等,但如果设计或实现不当,验证码本身可能成为安全。以下是对 Insecure CAPTCHA 的详细介绍,包括其原理、常见、手法、防御措施和实例分析。

一、Insecure CAPTCHA 的原理

验证码通常通过呈现一种人类易于理解但机器难以的挑战(如扭曲的文本、图像识别、数学题等)来区分人类和机器。可以利用不安全的验证码设计或实现缺陷,通过自动化手段绕过验证码的保护。

二、常见和手法

  1. 简单或重复的验证码
  • 验证码过于简单,或使用一组有限的验证码循环出现,使得攻击者可以通过或简单的猜测绕过验证。
  1. 验证码图像不扭曲
  • 图像中的文本不进行扭曲或变形,容易被 OCR(光学字符识别)工具识别和破解。
  1. 验证码传输不安全
  • 验证码在客户端和服务器之间的传输未加密,容易被中间人攻击截获和重用。
  1. 客户端验证
  • 验证码仅在客户端进行验证,可以通过修改客户端代码或使用代理工具绕过验证。
  1. 不变的验证码密钥
  • 验证码密钥长期不变,或密钥生成算法过于简单,容易被预测和破解。
  1. 验证码重放
  • 验证码的值未过期或重复使用,可以通过捕获和重放验证码请求绕过验证。

三、防御措施

  1. 使用复杂和随机的验证码
  • 生成复杂且随机的验证码,增加破解难度。
  1. 图像扭曲和变形
  • 对验证码图像进行适当的扭曲和变形,使 OCR 工具难以识别。
  1. 安全传输
  • 使用 HTTPS 确保验证码在传输过程中加密,防止被截获。
  1. 服务器端验证
  • 在服务器端进行验证码验证,防止客户端篡改。
  1. 动态验证码密钥
  • 定期更换验证码密钥,或使用更复杂的生成算法,防止预测。
  1. 验证码过期机制
  • 设置验证码的有效期,防止重放。
  1. 增加多重验证
  • 结合其他验证手段(如 IP 地址、行为分析等),增强验证的安全性。

一、Low

本流程如下

输入两个一致的密码,直接使用 BurpSuite 抓包

将 step 改为 2,进行测试

修改成功

二、Medium

与 Low 难度相比,增加了一个passed_capt,当passed_capt为true时就可以修改密码了

<?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' ],
        $_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 {
        // CAPTCHA was correct. Do both new passwords match?
        if( $pass_new == $pass_conf ) {
            // Show next stage for the user
            echo "
// 对参数passed_captcha进行验证,如果通过身份验证,该参数就为true
                <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 = ((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() . "';";
        $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 the end user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with the passwords matching
        echo "<pre>Passwords did not match.</pre>";
        $hide_form = false;
    }
 
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
 
?>

同样进行抓包

修改 step 为 2,后面增加参数 passed_captcha=true

修改成功!!

三、High

服务器的验证逻辑是当$resp(这里是指谷歌返回的验证结果)是false,并且参数

recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查

<?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']
    );
//(通过身份验证条件)或者 (参数g-recaptcha-respon为hidd3n_valu3并且参数 HTTP_USER_AGE为 reCAPTC)就算是验证通过了
    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();
 
?>

先抓包

修改参数  $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3'   $_SERVER[ 'HTTP_USER_AGENT' == 'reCAPTCHA'

成功!!

四、结论

Insecure CAPTCHA 是由于验证码系统设计或实现不当,导致其易于被攻击者绕过的安全。为了防止不安全的验证码,开发者应采取一系列措施,包括生成复杂和随机的验证码、对图像进行扭曲和变形、确保验证码传输安全、在服务器端进行验证、使用动态验证码密钥、设置验证码有效期以及结合其他验证手段。通过这些措施,可以有效提升验证码系统的安全性,保护应用程序免受自动化。


因实验环境问题,这次实验本文参考博客:https://www.cnblogs.com/chadlas/articles/15722429.html  

相关文章
|
1月前
|
SQL 安全 PHP
DVWA File Inclusion 通关解析
DVWA File Inclusion 通关解析
|
1月前
|
存储 安全 Linux
OverTheWire Bandit 通关解析(上)
OverTheWire Bandit 通关解析(上)
|
1月前
|
存储 SQL 安全
DVWA File Upload 通关解析
DVWA File Upload 通关解析
|
1月前
|
存储 Shell Linux
OverTheWire Bandit 通关解析(下)
OverTheWire Bandit 通关解析(下)
|
1月前
|
安全 Linux Shell
OverTheWire Bandit 通关解析(中)
OverTheWire Bandit 通关解析(中)
|
13天前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
41 6
|
2月前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
67 3
|
6天前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
25 1
|
6天前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
19 1
|
21天前
|
负载均衡 Java Spring
@EnableFeignClients注解源码解析
@EnableFeignClients注解源码解析
47 14

热门文章

最新文章

推荐镜像

更多