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(不安全验证)漏洞所有级别通关教程及源码审计的更多相关文章

  1. DVWA之Insecure Captcha

    Insecure CAPTCHA Insecure CAPTCHA,意思是不安全的验证码,CAPTCHA是Completely Automated Public Turing Test to Tell ...

  2. DVWA靶场之CSRF(跨站请求伪造)通关

    Low: 服务器就看了password_new与password_conf是否相同,没有其他的验证 重新构造一个html页面,(自己假装自己是受害者,ip是靶场ip非本地ip) 1 <img s ...

  3. DVWA靶场之File Upload(文件上传)通关

    Low: <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_pa ...

  4. DVWA靶场之Command Injection(命令行注入)通关

    Command Injection Low: <?php if( isset( $_POST[ 'Submit' ]  ) ) { // Get input $target = $_REQUES ...

  5. DVWA靶场实战(六)——Insecure CAPTCHA

    DVWA靶场实战(六) 六.Insecure CAPTCHA: 1.漏洞原理: Insecure CAPTCHA(不安全的验证码),CAPTCHA全程为Completely Automated Pub ...

  6. Laravel 5.3 用户验证源码探究 (一) 路由与注册

    https://blog.csdn.net/realghost/article/details/52558962 简介 Laravel 从 5.2 开始就有了开箱即用的用户验证,5.3 又在 5.2 ...

  7. DVWA 黑客攻防演练(六)不安全的验证码 Insecure CAPTCHA

    之前在 CSRF 攻击 的那篇文章的最后,我觉得可以用验证码提高攻击的难度. 若有验证码的话,就比较难被攻击者利用 XSS 漏洞进行的 CSRF 攻击了,因为要识别验证码起码要调用api,跨域会被浏览 ...

  8. DVWA全级别之Insecure CAPTCHA(不安全的验证码)

    Insecure CAPTCHA Insecure CAPTCHA,意思是不安全的验证码,CAPTCHA是Completely Automated Public Turing Test to Tell ...

  9. DVWA靶场之Brute Force(暴破)通关

    DVWA最经典PHP/MySQL老靶场,简单回顾一下通关流程吧 DVWA十大金刚,也是最常见的十种漏洞利用:Brute Force(暴破).Command Injection(命令行注入).CSRF( ...

  10. DVWA-全等级验证码Insecure CAPTCHA

    DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...

随机推荐

  1. NES 系统架构

    主机 NES(FC.红白机.小霸王)的系统架构可用下图表示: 系统中最核心的组件是 CPU,其它组件都可以算作 CPU 的外设.CPU 的外设包括:PPU(图像处理器).APU(音频处理器).WRAM ...

  2. swiper + ts 类型报错

    swiper + ts 类型报错 "swiper": "^9.4.1" 版本号 原因 修改 tsconfig.json 文件下面的 moduleResoluti ...

  3. 为什么在http协议中使用base64编码方式传输二进制文件

    相关: 图解 Base64 实现原理并使用 js 实现一个简单的 Base64 编码器 常用加密方法之Base64编解码及代码实现 一直都知道在http协议中使用base64的方式传递二进制文件,虽然 ...

  4. 深度解析:Air780E模组之SIM卡接口电路的设计原理

    ​ SIM卡接口用于连接SIM卡并读取SIM卡信息,以便在注册4G网络时进行鉴权身份验证,是4G通信系统的必要功能. 合宙低功耗4G模组经典型号Air780E支持两路SIM卡,支持双卡切换,便于设备灵 ...

  5. Moebius for SQL Server

    Moebius(莫比斯)介绍 Moebius数据库多活集群是格瑞趋势为SQL Server数据库研发的能够同时满足可用性.数据安全.容灾.读写分离.负载均衡的一站式多活集群.集群的名字取自Moebiu ...

  6. 社区发布非官方龙架构 .NET 9 SDK 发行版

    随着.NET 9的发布,龙芯的Loongarch 架构的.NET 9 SDK的发布也提上了日程,在龙芯.NET 的官方支持之外,今年在社区有一个非官方龙架构 .NET SDK 发行版(https:// ...

  7. python的egg的制作

    egg包是目前最流行的python应用打包部署方式.如何制作和安装egg包?下面我就简单的分析了一下. 总是安装别人的egg包,是不是也想制作自己的egg包呢?好,接下来我们就自己制作一个简单的egg ...

  8. golang之协程+chan通道

    [管道] 分为 有缓冲和无缓冲两种 无缓冲的与有缓冲channel有着重大差别,那就是一个是同步的 一个是非同步的. 比如: c1:=make(chan int) 无缓冲 c2:=make(chan ...

  9. 在vue中使用XLSX导出表格

    安装依赖 npm install file-saver xlsx -S 然后在需要的页面中引入依赖包 import FileSaver from 'file-saver'; import XLSX f ...

  10. rsync之实战

    简介 rsync是远程(或本地)复制和同步文件最常用的命令. 借助rsync命令,你可以跨目录,跨磁盘和跨网络远程与本地数据进行复制和同步.举例来说:在两台Linux主机之间进行数据备份和镜像.本文介 ...