当前位置: 首页 > news >正文

DVWA靶场通关笔记-验证码绕过reCAPTCHA(High级别)

目录

一、reCAPTCHA

二、代码审计(High级别)

1、渗透准备

(1)配置security为High级别。

(2)配置RECAPTCHA参数

(3)再次打开靶场

2、源码分析

(1)index.php

(2)High.php

(3)功能函数

(4)总结

三、渗透实战

1、渗透方法一

(1)源码修改

(2)点击change

2、渗透方法二

(1)源码修改

(2)修改密码

(3)bp改包


本系列为通过《DVWA靶场通关笔记》的reCAPTCHA关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践,本文为reCAPTCHA关卡High级别关卡的渗透部分。

一、reCAPTCHA

reCAPTCHA关卡模拟了网站验证码系统的实现,在通过绕过验证码的安全验证来实现密码修改等操作,不同安全等级存在不同的安全风险和绕过方法,本小节对高等级别的关卡进行渗透实战。

二、代码审计(High级别)

1、渗透准备

(1)配置security为High级别。

进入到reCAPTCHA关卡High页面,完整URL地址具体如下所示。

http://127.0.0.1/DVWA/vulnerabilities/captcha/

(2)配置RECAPTCHA参数

进入到DVWA的config目录,如下所示找到config.inc.php文件。

修改config.inc.php文件中如下内容,虽然在RECAPTCHA关卡的页面提示api-key需要通过https://www.google.com/recaptcha/admin/create生成,但是实际上这部分可以填充为自己的内容,如下所示。

$_DVWA[ 'recaptcha_public_key' ]  = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMOOYUAN';
$_DVWA[ 'recaptcha_private_key' ] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMOOYUAN';

修改后效果如下所示,记得修改后保存文件。

(3)再次打开靶场

如下所示,更新config.inc.php文件后,靶场可以正常打开,这是一个具有修改密码功能的页面。

2、源码分析

(1)index.php

进入DVWA靶场源目录,找到index.php源码。

这段代码实现了 DVWA (Damn Vulnerable Web Application) 中的reCAPTCHA关卡的演示页面,主要功能包括:DVWA的Insecure CAPTCHA模块通过四个安全等级(低、中、高、不可能)演示验证码系统的安全演进,该模块核心展示密码修改场景下的验证码实现,包含密钥检查、表单动态生成(根据等级显示不同字段)和安全警告提示,如客户端验证绕过、验证码重复使用等问题,并通过对比不同等级的实现差异,直观呈现从脆弱到安全的演进过程,最终强调应使用专业验证服务(如reCAPTCHA)配合多因素验证的整体防护思路。

  • 初始化与安全级别处理
    • 设置页面路径和安全依赖。
    • 根据用户安全级别(低、中、高、不可能)加载不同的验证码实现。
  • 验证码配置检查
    • 验证是否配置了 reCAPTCHA API 密钥。
    • 若未配置则显示警告并隐藏表单。
  • 表单构建
    • 生成密码修改表单,包含当前密码(仅 "不可能" 级别)、新密码和确认密码字段。
    • 根据安全级别不同,集成不同的验证码机制(低级、中级、高级和不可能四个级别)。
  • 安全措施
    • "高" 和 "不可能" 级别包含 CSRF 令牌保护。
    • "不可能" 级别增加了当前密码验证。

经过注释后的详细代码如下所示。

<?php
/*** DVWA Insecure CAPTCHA 演示页面* 演示不同安全等级下的验证码实现方式及潜在安全风险*/// 定义网站根目录路径
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );// 引入必要的库文件
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';          // DVWA核心页面库
require_once DVWA_WEB_PAGE_TO_ROOT . "external/recaptcha/recaptchalib.php";    // reCAPTCHA库// 初始化页面,要求认证并启用PHPIDS防护
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 创建新页面对象
$page = dvwaPageNewGrab();
// 设置页面标题
$page[ 'title' ]   = 'Vulnerability: Insecure CAPTCHA' . $page[ 'title_separator' ].$page[ 'title' ];
// 设置页面ID
$page[ 'page_id' ] = 'captcha';
// 设置帮助按钮
$page[ 'help_button' ]   = 'captcha';
// 设置源代码查看按钮
$page[ 'source_button' ] = 'captcha';// 连接数据库
dvwaDatabaseConnect();// 根据安全等级选择对应的实现文件
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {case 'low':      // 低安全等级$vulnerabilityFile = 'low.php';break;case 'medium':   // 中安全等级$vulnerabilityFile = 'medium.php';break;case 'high':     // 高安全等级$vulnerabilityFile = 'high.php';break;default:        // 默认(不可能等级)$vulnerabilityFile = 'impossible.php';break;
}// 控制表单是否显示
$hide_form = false;
// 引入对应的实现文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/captcha/source/{$vulnerabilityFile}";// 检查reCAPTCHA密钥配置
$WarningHtml = '';
if( $_DVWA[ 'recaptcha_public_key' ] == "" ) {$WarningHtml = "<div class=\"warning\"><em>reCAPTCHA API key missing</em> from config file: " . realpath( getcwd() . DIRECTORY_SEPARATOR . DVWA_WEB_PAGE_TO_ROOT . "config" . DIRECTORY_SEPARATOR . "config.inc.php" ) . "</div>";$html = "<em>Please register for a key</em> from reCAPTCHA: " . dvwaExternalLinkUrlGet( 'https://www.google.com/recaptcha/admin/create' );$hide_form = true;  // 密钥缺失时隐藏表单
}// 构建页面主体HTML
$page[ 'body' ] .= "
<div class=\"body_padded\"><h1>Vulnerability: Insecure CAPTCHA</h1>{$WarningHtml}<div class=\"vulnerable_code_area\"><form action=\"#\" method=\"POST\" ";// 密钥缺失时隐藏表单
if( $hide_form )$page[ 'body' ] .= "style=\"display:none;\"";$page[ 'body' ] .= "><h3>Change your password:</h3><br /><input type=\"hidden\" name=\"step\" value=\"1\" />\n";// 不可能等级需要验证当前密码
if( $vulnerabilityFile == 'impossible.php' ) {$page[ 'body' ] .= "Current password:<br /><input type=\"password\" AUTOCOMPLETE=\"off\" name=\"password_current\"><br />";
}$page[ 'body' ] .= "            New password:<br /><input type=\"password\" AUTOCOMPLETE=\"off\" name=\"password_new\"><br />Confirm new password:<br /><input type=\"password\" AUTOCOMPLETE=\"off\" name=\"password_conf\"><br />" . recaptcha_get_html( $_DVWA[ 'recaptcha_public_key' ] );  // 插入reCAPTCHA组件// 高安全等级下的开发者注释提示
if( $vulnerabilityFile == 'high.php' )$page[ 'body' ] .= "\n\n            <!-- **DEV NOTE**   Response: 'hidd3n_valu3'   &&   User-Agent: 'reCAPTCHA'   **/DEV NOTE** -->\n";// 高和不可能等级添加CSRF令牌
if( $vulnerabilityFile == 'high.php' || $vulnerabilityFile == 'impossible.php' )$page[ 'body' ] .= "\n            " . tokenField();$page[ 'body' ] .= "<br /><input type=\"submit\" value=\"Change\" name=\"Change\"></form>{$html}  <!-- 显示操作结果 --></div><h2>More Information</h2><ul><li>" . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/CAPTCHA' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.google.com/recaptcha/' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Testing_for_Captcha_(OWASP-AT-012)' ) . "</li></ul>
</div>\n";// 输出完整HTML页面
dvwaHtmlEcho( $page );?>

(2)High.php

进入DVWA靶场源目录,找到High.php源码。

打开源码High.php,

打开源码High.php,分析可知这段代码实现了实现了带有 CSRF 保护和 CAPTCHA 验证的密码更改功能,主要过程如下所示:

  • 增加了Anti-CSRF令牌防护(特别注意:由于本关卡这部分是乱填的,且会向https://www.google.com/recaptcha/api/siteverify提交请求,这个网站目前无法响应,故需注释掉这部分验证,否则没法向下继续走,但是相对于low和meidium关卡,本次没有必要强制设置$resp=1,默认情况下$resp=0)。
  • 使用reCAPTCHA进行人机验证
  • 需要验证当前密码
  • 使用PDO预处理语句防止SQL注入
  • 对密码进行MD5加密存储
  • 包含输入清理和验证

详细注释后的代码如下所示。 

<?php// 检查是否是密码修改请求
if( isset( $_POST[ 'Change' ] ) ) {// 1. 首先检查Anti-CSRF令牌,防止跨站请求伪造攻击checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 隐藏表单,准备显示结果$hide_form = true;// 2. 获取并处理新密码输入$pass_new  = $_POST[ 'password_new' ];$pass_new  = stripslashes( $pass_new );  // 去除反斜线// 转义特殊字符防止SQL注入$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 );  // MD5哈希(注:不够安全)// 3. 获取并处理确认密码$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 );// 4. 获取并处理当前密码$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 );// 5. 检查CAPTCHA验证//$resp = recaptcha_check_answer(//$_DVWA[ 'recaptcha_private_key' ],  // reCAPTCHA私钥//$_POST['g-recaptcha-response']     // 用户输入的验证码//);// CAPTCHA验证失败处理if( !$resp ) {$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;return;}else {// 6. 验证当前密码是否正确(使用PDO预处理语句)$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();// 7. 检查:新密码是否匹配且当前密码正确if( ( $pass_new == $pass_conf) && ( $data->rowCount() == 1 ) ) {// 8. 更新密码(使用PDO预处理语句)$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();// 9. 显示成功信息$html .= "<pre>Password Changed.</pre>";}else {// 10. 显示失败信息(当前密码错误或新密码不匹配)$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}}
}// 11. 生成新的Anti-CSRF令牌供下次使用
generateSessionToken();?>

(3)功能函数

根据如下代码可知,CheckCaptcha函数会像谷歌https://www.google.com/recaptcha/api/siteverify进行请求,CheckCaptcha和recaptcha_get_html函数的定义如下所示。

<?php/*** 验证码验证函数(兼容旧版API)* * @param string $key 私钥* @param string $response 用户提交的验证码响应* @return bool|NULL 验证成功返回true,失败返回false,异常返回NULL*/
function recaptcha_check_answer($key, $response){return CheckCaptcha($key, $response);
}/*** 发送HTTP请求验证验证码* * @param string $key 私钥* @param string $response 用户提交的验证码响应* @return bool|NULL 验证成功返回true,失败返回false,异常返回NULL*/
function CheckCaptcha($key, $response) {try {// Google reCAPTCHA验证API地址$url = 'https://www.google.com/recaptcha/api/siteverify';// 准备POST数据$dat = array('secret'   => $key,                 // 网站私钥'response' => urlencode($response), // 用户响应(由前端生成)'remoteip' => urlencode($_SERVER['REMOTE_ADDR']) // 用户IP地址);// 配置HTTP请求选项$opt = array('http' => array('header'  => "Content-type: application/x-www-form-urlencoded\r\n",'method'  => 'POST','content' => http_build_query($dat) // 生成POST数据));// 创建HTTP上下文并发送请求$context = stream_context_create($opt);$result  = file_get_contents($url, false, $context);// 解析JSON响应并返回验证结果return json_decode($result)->success;} catch (Exception $e) {// 发生异常时返回NULLreturn null;}
}/*** 生成前端验证码HTML代码* * @param string $pubKey 公钥* @return string HTML代码片段*/
function recaptcha_get_html($pubKey){return "<script src='https://www.google.com/recaptcha/api.js'></script><br /> <div class='g-recaptcha' data-theme='dark' data-sitekey='" . $pubKey . "'></div>";
}?>

 三个函数功能详解,如下所示。

  • recaptcha_check_answer
    • 功能:验证用户提交的验证码是否有效(兼容旧版 API)。
    • 流程:直接调用CheckCaptcha函数进行验证。
    • 安全作用:作为入口函数提供向后兼容性。
  • CheckCaptcha
    • 功能:向 Google 服务器发送验证请求并处理响应。
    • 流程
      • 构建 POST 请求参数(私钥、用户响应、IP 地址)。
      • 配置 HTTP 请求上下文(设置请求头、方法和内容)。
      • 发送请求到 Google 验证 API。
      • 解析 JSON 响应并提取验证结果。
    • 安全作用:核心验证逻辑,防止 CSRF 攻击和机器人自动化操作。
  • recaptcha_get_html
    • 功能:生成前端验证码 UI 组件。
    • 流程
      • 引入 Google reCAPTCHA JavaScript 库。
      • 创建带有公钥的验证码容器(暗色主题)。
    • 安全作用:在页面中正确渲染验证码组件,确保用户交互。

(4)总结

相对而言,本关卡的判断如下所示。

if ( $resp || ( $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' )

有两种方法:

  • 其一为resp=1,即通过token验证
  • 其二为g-recaptcha-response参数为'hidd3n_valu3'且HTTP_USER_AGENT参数为'reCAPTCHA'

三、渗透实战

1、渗透方法一

(1)源码修改

将resp=1,模拟通过token验证的情况,如下所示。

(2)点击change

bp设置拦截报文,进入靶场并将密码改为123,如下所示。

http://127.0.0.1/DVWA/vulnerabilities/captcha/

此时bursuite抓包,发现step=1,报文如下所示。

此时页面也变为如下形式,提示“Password Changed.”,具体如下所示。

很明显修改密码相对于前两个关卡(low级别和medium级别有两个step报文),本high关卡只有1个报文(step1),接下来我们将这个报文发送到repeater如下所示。 

在repeater中,通过修改如下红框中的密码0000来进行渗透。

2、渗透方法二

(1)源码修改

需要配置g-recaptcha-response参数为'hidd3n_valu3'且HTTP_USER_AGENT参数为'reCAPTCHA'

(2)修改密码

bp设置拦截报文,进入靶场http://127.0.0.1/DVWA/vulnerabilities/captcha/,将密码改为321,如下所示。

点击修改,页面提示修改失败,这是因为“( $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' )判断失败”,具体如下所示。

burpsuite抓包,报文显示如下所示,很明显post参数缺少g-recaptcha-response=hidd3n_valu3,而useragent需要配置为reCAPTCHA。接下来我们将报文发送到repeater,如下图所示。

(3)bp改包

报文发送到repeater模块如下所示。

将密码修改为1234,同时POST增加参数g-recaptcha-response=hidd3n_valu3,useragent修改为reCAPTCHA,点击发送,如下所示密码修改成功。

http://www.lryc.cn/news/580367.html

相关文章:

  • vue中添加原生右键菜单
  • 【零基础学AI】第24讲:卷积神经网络(CNN)架构设计
  • 【无标题】Go语言中的反射机制 — 元编程技巧与注意事项
  • 3dmax物理材质转换标准材质,物理材质转VR材质,VR材质转标准材质3dmax物理材质转标准材质插件
  • 电脑休眠设置
  • c++ python 共享内存
  • 后端树形结构
  • STM32F103RCTx的PWM输出控制电机
  • js游戏简单修改
  • React Native 开发环境搭建--mac--android--奔溃的一天
  • Hinge×亚矩云手机:以“深度连接”为名,重构云端社交的“真实感”
  • CSS02:四种CSS导入方式
  • pyspark大规模数据加解密优化实践
  • Python小工具之PDF合并
  • 数据结构:多维数组在内存中的映射(Address Mapping of Multi-dimensional Arrays)
  • IDEA中application.yml配置文件不自动提示解决办法
  • 如何在IntelliJ IDEA中设置数据库连接全局共享
  • 从“电话催维修“到“手机看进度“——售后服务系统开发如何重构客户体验
  • CppCon 2018 学习:Surprises In Object Lifetime
  • Kotlin 协程:Channel 与 Flow 深度对比及 Channel 使用指南
  • 【ES6】Latex总结笔记生成器(网页版)
  • Jenkins Pipeline(二)
  • 【Elasticsearch】深度分页及其替代方案
  • 【openp2p】 学习2:源码阅读P2PNetwork和P2PTunnel
  • 【STM32实践篇】:GPIO 详解
  • 网络资源模板--基于Android Studio 实现的极简天气App
  • Excel 数据透视表不够用时,如何处理来自多个数据源的数据?
  • 动手实践OpenHands系列学习笔记1:Docker基础与OpenHands容器结构
  • Softhub软件下载站实战开发(十三):软件管理前端分片上传实现
  • 用户中心Vue3网页开发(1.0版)