前言
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 的原理
验证码通常通过呈现一种人类易于理解但机器难以的挑战(如扭曲的文本、图像识别、数学题等)来区分人类和机器。可以利用不安全的验证码设计或实现缺陷,通过自动化手段绕过验证码的保护。
二、常见和手法
- 简单或重复的验证码
- 验证码过于简单,或使用一组有限的验证码循环出现,使得攻击者可以通过或简单的猜测绕过验证。
- 验证码图像不扭曲
- 图像中的文本不进行扭曲或变形,容易被 OCR(光学字符识别)工具识别和破解。
- 验证码传输不安全
- 验证码在客户端和服务器之间的传输未加密,容易被中间人攻击截获和重用。
- 客户端验证
- 验证码仅在客户端进行验证,可以通过修改客户端代码或使用代理工具绕过验证。
- 不变的验证码密钥
- 验证码密钥长期不变,或密钥生成算法过于简单,容易被预测和破解。
- 验证码重放
- 验证码的值未过期或重复使用,可以通过捕获和重放验证码请求绕过验证。
三、防御措施
- 使用复杂和随机的验证码
- 生成复杂且随机的验证码,增加破解难度。
- 图像扭曲和变形
- 对验证码图像进行适当的扭曲和变形,使 OCR 工具难以识别。
- 安全传输
- 使用 HTTPS 确保验证码在传输过程中加密,防止被截获。
- 服务器端验证
- 在服务器端进行验证码验证,防止客户端篡改。
- 动态验证码密钥
- 定期更换验证码密钥,或使用更复杂的生成算法,防止预测。
- 验证码过期机制
- 设置验证码的有效期,防止重放。
- 增加多重验证
- 结合其他验证手段(如 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