DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计
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加密算法
<?php
if (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才能正常修改
?php
if (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令牌使的更安全
<?php
if (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();
?>
DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计的更多相关文章
- DVWA之Insecure Captcha
Insecure CAPTCHA Insecure CAPTCHA,意思是不安全的验证码,CAPTCHA是Completely Automated Public Turing Test to Tell ...
- DVWA靶场之CSRF(跨站请求伪造)通关
Low: 服务器就看了password_new与password_conf是否相同,没有其他的验证 重新构造一个html页面,(自己假装自己是受害者,ip是靶场ip非本地ip) 1 <img s ...
- DVWA靶场之File Upload(文件上传)通关
Low: <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_pa ...
- DVWA靶场之Command Injection(命令行注入)通关
Command Injection Low: <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = $_REQUES ...
- DVWA靶场实战(六)——Insecure CAPTCHA
DVWA靶场实战(六) 六.Insecure CAPTCHA: 1.漏洞原理: Insecure CAPTCHA(不安全的验证码),CAPTCHA全程为Completely Automated Pub ...
- Laravel 5.3 用户验证源码探究 (一) 路由与注册
https://blog.csdn.net/realghost/article/details/52558962 简介 Laravel 从 5.2 开始就有了开箱即用的用户验证,5.3 又在 5.2 ...
- DVWA 黑客攻防演练(六)不安全的验证码 Insecure CAPTCHA
之前在 CSRF 攻击 的那篇文章的最后,我觉得可以用验证码提高攻击的难度. 若有验证码的话,就比较难被攻击者利用 XSS 漏洞进行的 CSRF 攻击了,因为要识别验证码起码要调用api,跨域会被浏览 ...
- DVWA全级别之Insecure CAPTCHA(不安全的验证码)
Insecure CAPTCHA Insecure CAPTCHA,意思是不安全的验证码,CAPTCHA是Completely Automated Public Turing Test to Tell ...
- DVWA靶场之Brute Force(暴破)通关
DVWA最经典PHP/MySQL老靶场,简单回顾一下通关流程吧 DVWA十大金刚,也是最常见的十种漏洞利用:Brute Force(暴破).Command Injection(命令行注入).CSRF( ...
- DVWA-全等级验证码Insecure CAPTCHA
DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...
随机推荐
- IDEA久违了!FeignX插件支持方法级别的导航跳转
> 需求调研:发现身边的同事追踪业务代码的时候,如果遇见feign接口,大家都是通过全局搜url进一步找到远程服务的实现.一旦项目大起来,路径变得复杂甚至重名之后,这将会是灾难. 市面上并没有很 ...
- 【速记】C++ STL自定义排序
因为是"速记",难免会有不完善的地方.这篇笔记咱日后应该还会进行补充. 关于sort的比较函数 void sort( RandomIt first, RandomIt last, ...
- CentOS环境下OpenSSH9.8p1升级实践
安装Telnet服务 为了避免升级OpenSSH导致服务器不可连接.需要先下载安装Telnet组件.升级期间使用Telnet作为升级期间的服务器连接方式. 先查询telnet是否安装 rpm -qa ...
- 部署包含Oracle数据源的项目
这段时间在处理公司EAS的数据报表,需要通过ETL进行数据的抽取,当ETL都完成并在本地跑成功后,总以为万事大吉了,没想到部署到作业后,却一直无法成功,百度搜索了好多方法,跟着上面去操作还是一直报错, ...
- swiper + ts 类型报错
swiper + ts 类型报错 "swiper": "^9.4.1" 版本号 原因 修改 tsconfig.json 文件下面的 moduleResoluti ...
- vim粘贴文件格式不乱
vim粘贴防止格式乱,配置以下命令然后在粘贴,即可~ :set paste
- 一个基于.Net Core 开源的物联网基础平台
在智慧工厂领域,智慧城市领域,都需要对设备进行监控.比如工厂需要对周围环境温度.湿度.气压.电压,灯的开关进行监控.这时候就需要物联网平台来进行管理. 在智慧工厂领域,宝马集团通过英伟达的Omnive ...
- GAN和CGAN——生成式对抗网络和条件生成式对抗网络
GAN的定义 GAN是一个评估和学习生成模型的框架.生成模型的目标是学习到输入样本的分布,用来生成样本.GAN和传统的生成模型不同,使用两个内置模型以"对抗"的方式来使学习分布不断 ...
- 读书笔记-C#8.0本质论-04
18. 多线程 18.1 多线程基础 处理器受限延迟(Processor-bound latency):假定一个计算需要执行120亿次算术运算,而总共的处理能力是每秒60亿次,那么从请求结果到获得结果 ...
- Hibernate 之Hibernate缓存
1.缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache(摘自Robbin的<缓存技术浅谈>).目的:让数据 ...