DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计

news/2025/1/6 13:47:04/文章来源:https://www.cnblogs.com/GuijiH6/p/18651665

Insecure CAPTCHA(不安全验证)

Insecure CAPTCHA(不安全验证)漏洞指的是在实现 CAPTCHA(完全自动化公共图灵测试区分计算机和人类)机制时,未能有效保护用户输入的验证信息,从而使得攻击者能够绕过或破解该验证机制。这类漏洞通常出现在网络应用程序中,目的是防止自动化脚本(如机器人)对网站进行滥用,CAPTCHA全称为Completely Automated Public Turing Test to Tell Computers and Humans Apart,中文名字是全自动区分计算机和人类的图灵测试

low

正常修改会报错

重新修改密码并抓包发送到重放器

step=1修改为step=2,发包

修改成功

源码审计

并没有什么过滤,设置了step=2才能修改,使用**mysqli_real_escape_string**可能SQL注入;使用了不安全的md5加密算法

<?phpif (isset($_POST['Change']) && ($_POST['step'] == '1')) { // Step 1: 用户提交了第一个表单,并且是第一步$hide_form = true; // 标识隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new  = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 通过第三方服务检查CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// CAPTCHA验证未通过if (!$resp) {$html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 如果错误,不隐藏表单return;} else {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 如果匹配,让用户确认更改$html .= "<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=\"submit\" name=\"Change\" value=\"Change\" /></form>";} else {// 两次输入的密码不匹配$html     .= "<pre>Both passwords must match.</pre>";$hide_form = false; // 不隐藏表单,提示用户重新输入}}
}
if (isset($_POST['Change']) && ($_POST['step'] == '2')) { // Step 2: 用户提交确认后的表单,进行更改操作$hide_form = true; // 隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new  = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 确认两个密码匹配if ($pass_new == $pass_conf) {// 对特殊字符进行转义,防止SQL注入$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 将密码进行md5加密(注:md5已不再安全,实际应用中应使用更安全的加密方式)$pass_new = md5($pass_new);// 更新数据库中当前用户的密码$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>');// 给用户反馈密码已更改$html .= "<pre>Password Changed.</pre>";} else {// 两次输入的密码不匹配$html .= "<pre>Passwords did not match.</pre>";$hide_form = false; // 提示错误,不隐藏表单}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

medium

同样修改后抓包

这里查看源码可以发现设置了passed_captcha验证

step=1修改为step=2,并且添加passed_captcha=true

修改成功

源码审计

与low级别差不多,多了一个设置passed_captcha=true才能正常修改

?phpif (isset($_POST['Change']) && ($_POST['step'] == '1')) {// 第一步:用户提交了表单且处于步骤1$hide_form = true; // 标识隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 从第三方验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// CAPTCHA验证未通过if (!$resp) {$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 如果错误,不隐藏表单return;} else {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 密码匹配,显示下一步$html .= "<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 {// 两次输入的密码不匹配$html .= "<pre>Both passwords must match.</pre>";$hide_form = false; // 不隐藏表单,提示用户重新输入}}
}
if (isset($_POST['Change']) && ($_POST['step'] == '2')) {// 第二步:用户提交确认后的表单$hide_form = true; // 隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 确保用户完成了第一步if (!$_POST['passed_captcha']) {$html .= "<pre><br />You have not passed the CAPTCHA.</pre>";$hide_form = false;return;}// 检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 匹配进行密码更新// 转义特殊字符,防止SQL注入$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 使用md5加密密码(注意:md5不够安全,实际应用中应使用更好的加密方法)$pass_new = md5($pass_new);// 更新数据库中的用户密码$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>');// 反馈用户密码已更改$html .= "<pre>Password Changed.</pre>";} else {// 两次输入的密码不匹配$html .= "<pre>Passwords did not match.</pre>";$hide_form = false;}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

high

定位登录框,发现这么一处注释

 **DEV NOTE**   Response: 'hidd3n_valu3'   &&   User-Agent: 'reCAPTCHA'   **/DEV NOTE** 

结合源码得知需要g-recaptcha-response=hidd3n_valu3 并且 User-Agent: 'reCAPTCHA'

同样修改后抓包

发送包并修改参数

修改成功

源码审计

设置了请求头:reCAPTCHA ; g-recaptcha-response = hidd3n_valu3,以及token使会话更有安全性,还利用CSRF令牌使的更安全

<?phpif (isset($_POST['Change'])) {// 用户提交了表单,隐藏CAPTCHA表单$hide_form = true;// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// 检查CAPTCHA验证是否通过或符合内置绕过条件if ($resp || ($_POST['g-recaptcha-response'] == 'hidd3n_valu3'&& $_SERVER['HTTP_USER_AGENT'] == 'reCAPTCHA')) {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 转义输入以防止SQL注入攻击$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 使用md5加密密码(注意:不推荐在生产环境中使用)$pass_new = md5($pass_new);// 更新数据库用户密码$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>');// 返回用户的反馈信息$html .= "<pre>Password Changed.</pre>";} else {// 如果密码不匹配$html .= "<pre>Both passwords must match.</pre>";$hide_form = false;}} else {// CAPTCHA输入错误时的响应$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);
}// 生成反CSRF攻击的令牌
generateSessionToken();
?>

impossible

源码审计

结合反CSRF令牌和CAPTCHA,提高安全性;并且使用PDO和参数绑定防止SQL注入。

<?php
if (isset($_POST['Change'])) {// 检查反CSRF令牌,确保请求的合法性checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');// 隐藏CAPTCHA表单$hide_form = true;// 获取用户输入的新密码,并移除转义字符$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) : "");$pass_new = md5($pass_new); // 对新密码进行MD5加密// 获取用户输入的确认密码,并移除转义字符$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) : "");$pass_conf = md5($pass_conf); // 对确认密码进行MD5加密// 获取用户输入的当前密码,并移除转义字符$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) : "");$pass_curr = md5($pass_curr); // 对当前密码进行MD5加密// 使用第三方功能验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// 如果CAPTCHA验证失败if (!$resp) {// 反馈信息:CAPTCHA错误$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;} else {// 检查当前密码是否正确$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();// 检查新密码是否匹配,且当前密码是否正确if (($pass_new == $pass_conf) && ($data->rowCount() == 1)) {// 更新数据库中的用户密码$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();// 用户反馈:成功$html .= "<pre>Password Changed.</pre>";} else {// 用户反馈:失败$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}}
}// 生成反CSRF攻击的令牌
generateSessionToken();
?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863786.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

摄影

曝光三要素 光圈(F):控制进光量的装置 快门(1/x):接收光线的时间 感光度(ISO):感光器件对光线的敏感程度 快门(1/x) 快门快 数值小 画面暗 快门慢 数值大 画面亮 快门影响画面动态模糊(如果要保证拍摄的物体,不模糊,快速速度要大于物体运动的速度) 安全快门:保证…

浅谈文本匹配

本文探讨了文本匹配的演变,从字面匹配到语义匹配,分析了各自的特点与挑战。字面匹配关注文本的精确重合度,而语义匹配则试图理解文本的深层含义。尽管语义匹配在处理复杂关系时更具优势,但仍面临长短文本匹配、词序感知和多实体关系等难题。期待未来大模型能进一步提升语义…

记第一次DC靶场渗透

前言:听了朋友的说渗透可以快速入门,心血来潮去刷了DC-1这个靶场,结果老实了,跟着wp做了一遍,许多不懂的地方就去搜知识点,记了个笔记也是花了1天左右的时间。顺便水一篇博客借鉴的WP: DC-1靶场搭建及渗透实战详细过程(DC靶场系列) 开始渗透之旅: 前置: DC靶场网上一…

[网络] 反向代理与内网穿透:FRPC

缘起: GradioGradio是一款快速构建AI Web演示应用的Python Web框架(主要适用于科研、实验室,而非ToC的Web应用),其支持本地运行和远程访问。1个极简的Gradio代码:app.pyimport gradio as gr # 导入gradio库,gradio用于快速创建机器学习模型的web界面# 定义一个名为greet…

windows11使用pycharm连接wsl2开发基于poetry的python项目

windows11使用pycharm连接wsl2开发基于poetry的python项目 背景:公司开发的python项目用到了某个只提供了Linux版本的包,遂研究了一番如何在windows环境下进行开发。windows安装 wsl2 进入到wsl2中,安装对应的python版本,建议使用pyenv,下面以3.10.14版本为例子。 pyenv安…

【反爬虫】接口安全的风控介绍

#风控 #接口信息安全 #业务线 一、接口反爬背景二、反爬数据流框架介绍2.1 数据接入风控2.2 风险感知和策略迭代2.2.1 短线近实时监控告警2.2.2 风控策略部署2.3 异常流量处置能力2.4 网关验签组件的设计和应用2.4.1 验签整体架构2.4.2 接口验签加密流程三、反爬效果体现3.1 普…

发布blazor应用到Linux, 使用nginx作为WebSocket代理

Blazor 使用了SignalR连接, 而SignalR使用的是WebSocket WebSocket协议提供了一种创建支持客户端和服务器之间实时双向通信的 Web 应用程序的方法。作为 HTML5 的一部分,WebSocket 使开发此类应用程序比以前的方法容易得多。大多数现代浏览器都支持 WebSocket,包括 Chrome、F…

读数据保护:工作负载的可恢复性25公用云存储

公有云存储1. 对象存储 1.1. 对象存储可能是未来比较适合长期保存备份与档案的一种技术 1.2. 它的核心功能本身就已经含有保护数据所需的一些特性 1.3. 对象存储系统里的所有数据都能自动复制到多个地点,这意味着它天生就符合3-2-1原则 1.4. 对象存储还可以应对磁退化的问题,…

C#进阶

进阶 目录进阶枚举数组值类型和引用类型函数函数基础ref和out变长参数和参数默认值函数重载递归函数复杂数据类型结构体排序冒泡排序选择排序飞行棋项目C#高级语法面向对象成员变量构造函数成员属性索引器静态成员拓展方法运算符重载内部类和分部类继承里氏替换原则继承中的构造…

P11503 [NordicOI 2018] Nordic Camping

P11503 [NordicOI 2018] Nordic Camping 花了我挺长时间。 帐篷都是正方形的,可以枚举左上角,二分正方形边长,二维前缀和判断是否合法。这部分复杂度为 \(O(n^2\log n)\)。处理出来后,问题似乎就变成了矩形取最大值,单点查询。直接做是 \(\log^2\) 的,65 pts。具体就是,…

OpenXR间接链接、API层总体排序、加载器设计

OpenXR间接链接 通过加载器间接链接,应用程序动态生成OpenXR命令调度表。如果找不到加载器,或者只有比应用程序更旧的API,则此方法允许应用程序正常失败。为此,应用程序在加载器库上,使用特定平台的动态符号,查找(如dlsym())xrGetInstanceProcAddr命令的地址。一旦发…