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

打印 上一主题 下一主题

主题 846|帖子 846|积分 2538

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加密算法
  1. <?php
  2. if (isset($_POST['Change']) && ($_POST['step'] == '1')) {
  3.     // Step 1: 用户提交了第一个表单,并且是第一步
  4.     $hide_form = true; // 标识隐藏CAPTCHA表单
  5.     // 获取用户输入的新密码和确认密码
  6.     $pass_new  = $_POST['password_new'];
  7.     $pass_conf = $_POST['password_conf'];
  8.     // 通过第三方服务检查CAPTCHA
  9.     $resp = recaptcha_check_answer(
  10.         $_DVWA['recaptcha_private_key'],
  11.         $_POST['g-recaptcha-response']
  12.     );
  13.     // CAPTCHA验证未通过
  14.     if (!$resp) {
  15.         $html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
  16.         $hide_form = false; // 如果错误,不隐藏表单
  17.         return;
  18.     } else {
  19.         // CAPTCHA验证通过,检查两次输入的密码是否匹配
  20.         if ($pass_new == $pass_conf) {
  21.             // 如果匹配,让用户确认更改
  22.             $html .= "
  23.                 <pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
  24.                 <form action="#" method="POST">
  25.                     <input type="hidden" name="step" value="2" />
  26.                     <input type="hidden" name="password_new" value="{$pass_new}" />
  27.                     <input type="hidden" name="password_conf" value="{$pass_conf}" />
  28.                     <input type="submit" name="Change" value="Change" />
  29.                 </form>";
  30.         } else {
  31.             // 两次输入的密码不匹配
  32.             $html     .= "<pre>Both passwords must match.</pre>";
  33.             $hide_form = false; // 不隐藏表单,提示用户重新输入
  34.         }
  35.     }
  36. }
  37. if (isset($_POST['Change']) && ($_POST['step'] == '2')) {
  38.     // Step 2: 用户提交确认后的表单,进行更改操作
  39.     $hide_form = true; // 隐藏CAPTCHA表单
  40.     // 获取用户输入的新密码和确认密码
  41.     $pass_new  = $_POST['password_new'];
  42.     $pass_conf = $_POST['password_conf'];
  43.     // 确认两个密码匹配
  44.     if ($pass_new == $pass_conf) {
  45.         // 对特殊字符进行转义,防止SQL注入
  46.         $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");
  47.         // 将密码进行md5加密(注:md5已不再安全,实际应用中应使用更安全的加密方式)
  48.         $pass_new = md5($pass_new);
  49.         // 更新数据库中当前用户的密码
  50.         $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
  51.         $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>');
  52.         // 给用户反馈密码已更改
  53.         $html .= "<pre>Password Changed.</pre>";
  54.     } else {
  55.         // 两次输入的密码不匹配
  56.         $html .= "<pre>Passwords did not match.</pre>";
  57.         $hide_form = false; // 提示错误,不隐藏表单
  58.     }
  59.     // 关闭数据库连接
  60.     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  61. }
  62. ?>
复制代码
medium

同样修改后抓包

这里检察源码可以发现设置了passed_captcha验证

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

修改乐成
源码审计

与low级别差不多,多了一个设置passed_captcha=true才华正常修改
  1. ?php
  2. if (isset($_POST['Change']) && ($_POST['step'] == '1')) {
  3.     // 第一步:用户提交了表单且处于步骤1
  4.     $hide_form = true; // 标识隐藏CAPTCHA表单
  5.     // 获取用户输入的新密码和确认密码
  6.     $pass_new = $_POST['password_new'];
  7.     $pass_conf = $_POST['password_conf'];
  8.     // 从第三方验证CAPTCHA
  9.     $resp = recaptcha_check_answer(
  10.         $_DVWA['recaptcha_private_key'],
  11.         $_POST['g-recaptcha-response']
  12.     );
  13.     // CAPTCHA验证未通过
  14.     if (!$resp) {
  15.         $html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
  16.         $hide_form = false; // 如果错误,不隐藏表单
  17.         return;
  18.     } else {
  19.         // CAPTCHA验证通过,检查两次输入的密码是否匹配
  20.         if ($pass_new == $pass_conf) {
  21.             // 密码匹配,显示下一步
  22.             $html .= "
  23.                 <pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
  24.                 <form action="#" method="POST">
  25.                     <input type="hidden" name="step" value="2" />
  26.                     <input type="hidden" name="password_new" value="{$pass_new}" />
  27.                     <input type="hidden" name="password_conf" value="{$pass_conf}" />
  28.                     <input type="hidden" name="passed_captcha" value="true" />
  29.                     <input type="submit" name="Change" value="Change" />
  30.                 </form>";
  31.         } else {
  32.             // 两次输入的密码不匹配
  33.             $html .= "<pre>Both passwords must match.</pre>";
  34.             $hide_form = false; // 不隐藏表单,提示用户重新输入
  35.         }
  36.     }
  37. }
  38. if (isset($_POST['Change']) && ($_POST['step'] == '2')) {
  39.     // 第二步:用户提交确认后的表单
  40.     $hide_form = true; // 隐藏CAPTCHA表单
  41.     // 获取用户输入的新密码和确认密码
  42.     $pass_new = $_POST['password_new'];
  43.     $pass_conf = $_POST['password_conf'];
  44.     // 确保用户完成了第一步
  45.     if (!$_POST['passed_captcha']) {
  46.         $html .= "<pre><br />You have not passed the CAPTCHA.</pre>";
  47.         $hide_form = false;
  48.         return;
  49.     }
  50.     // 检查两次输入的密码是否匹配
  51.     if ($pass_new == $pass_conf) {
  52.         // 匹配进行密码更新
  53.         // 转义特殊字符,防止SQL注入
  54.         $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");
  55.         
  56.         // 使用md5加密密码(注意:md5不够安全,实际应用中应使用更好的加密方法)
  57.         $pass_new = md5($pass_new);
  58.         // 更新数据库中的用户密码
  59.         $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
  60.         $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>');
  61.         // 反馈用户密码已更改
  62.         $html .= "<pre>Password Changed.</pre>";
  63.     } else {
  64.         // 两次输入的密码不匹配
  65.         $html .= "<pre>Passwords did not match.</pre>";
  66.         $hide_form = false;
  67.     }
  68.     // 关闭数据库连接
  69.     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  70. }
  71. ?>
复制代码
high

定位登录框,发现这么一处注释
  1. **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令牌使的更安全
  1. <?php
  2. if (isset($_POST['Change'])) {
  3.     // 用户提交了表单,隐藏CAPTCHA表单
  4.     $hide_form = true;
  5.     // 获取用户输入的新密码和确认密码
  6.     $pass_new = $_POST['password_new'];
  7.     $pass_conf = $_POST['password_conf'];
  8.     // 验证CAPTCHA
  9.     $resp = recaptcha_check_answer(
  10.         $_DVWA['recaptcha_private_key'],
  11.         $_POST['g-recaptcha-response']
  12.     );
  13.     // 检查CAPTCHA验证是否通过或符合内置绕过条件
  14.     if (
  15.         $resp ||
  16.         (
  17.             $_POST['g-recaptcha-response'] == 'hidd3n_valu3'
  18.             && $_SERVER['HTTP_USER_AGENT'] == 'reCAPTCHA'
  19.         )
  20.     ) {
  21.         // CAPTCHA验证通过,检查两次输入的密码是否匹配
  22.         if ($pass_new == $pass_conf) {
  23.             // 转义输入以防止SQL注入攻击
  24.             $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");
  25.             
  26.             // 使用md5加密密码(注意:不推荐在生产环境中使用)
  27.             $pass_new = md5($pass_new);
  28.             // 更新数据库用户密码
  29.             $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";
  30.             $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>');
  31.             // 返回用户的反馈信息
  32.             $html .= "<pre>Password Changed.</pre>";
  33.         } else {
  34.             // 如果密码不匹配
  35.             $html .= "<pre>Both passwords must match.</pre>";
  36.             $hide_form = false;
  37.         }
  38.     } else {
  39.         // CAPTCHA输入错误时的响应
  40.         $html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
  41.         $hide_form = false;
  42.         return;
  43.     }
  44.     // 关闭数据库连接
  45.     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  46. }
  47. // 生成反CSRF攻击的令牌
  48. generateSessionToken();
  49. ?>
复制代码
impossible

源码审计

结合反CSRF令牌和CAPTCHA,提高安全性;而且使用PDO和参数绑定防止SQL注入。
  1. <?php
  2. if (isset($_POST['Change'])) {
  3.     // 检查反CSRF令牌,确保请求的合法性
  4.     checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');
  5.     // 隐藏CAPTCHA表单
  6.     $hide_form = true;
  7.     // 获取用户输入的新密码,并移除转义字符
  8.     $pass_new = $_POST['password_new'];
  9.     $pass_new = stripslashes($pass_new);
  10.     $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");
  11.     $pass_new = md5($pass_new); // 对新密码进行MD5加密
  12.     // 获取用户输入的确认密码,并移除转义字符
  13.     $pass_conf = $_POST['password_conf'];
  14.     $pass_conf = stripslashes($pass_conf);
  15.     $pass_conf = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_conf) : "");
  16.     $pass_conf = md5($pass_conf); // 对确认密码进行MD5加密
  17.     // 获取用户输入的当前密码,并移除转义字符
  18.     $pass_curr = $_POST['password_current'];
  19.     $pass_curr = stripslashes($pass_curr);
  20.     $pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_curr) : "");
  21.     $pass_curr = md5($pass_curr); // 对当前密码进行MD5加密
  22.     // 使用第三方功能验证CAPTCHA
  23.     $resp = recaptcha_check_answer(
  24.         $_DVWA['recaptcha_private_key'],
  25.         $_POST['g-recaptcha-response']
  26.     );
  27.     // 如果CAPTCHA验证失败
  28.     if (!$resp) {
  29.         // 反馈信息:CAPTCHA错误
  30.         $html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
  31.         $hide_form = false;
  32.     } else {
  33.         // 检查当前密码是否正确
  34.         $data = $db->prepare('SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;');
  35.         $data->bindParam(':user', dvwaCurrentUser(), PDO::PARAM_STR);
  36.         $data->bindParam(':password', $pass_curr, PDO::PARAM_STR);
  37.         $data->execute();
  38.         // 检查新密码是否匹配,且当前密码是否正确
  39.         if (($pass_new == $pass_conf) && ($data->rowCount() == 1)) {
  40.             // 更新数据库中的用户密码
  41.             $data = $db->prepare('UPDATE users SET password = (:password) WHERE user = (:user);');
  42.             $data->bindParam(':password', $pass_new, PDO::PARAM_STR);
  43.             $data->bindParam(':user', dvwaCurrentUser(), PDO::PARAM_STR);
  44.             $data->execute();
  45.             // 用户反馈:成功
  46.             $html .= "<pre>Password Changed.</pre>";
  47.         } else {
  48.             // 用户反馈:失败
  49.             $html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";
  50.             $hide_form = false;
  51.         }
  52.     }
  53. }
  54. // 生成反CSRF攻击的令牌
  55. generateSessionToken();
  56. ?>
复制代码
  1.      $data->execute();
  2.         // 用户反馈:成功
  3.         $html .= "<pre>Password Changed.</pre>";
  4.     } else {
  5.         // 用户反馈:失败
  6.         $html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";
  7.         $hide_form = false;
  8.     }
  9. }
复制代码
}
// 天生反CSRF攻击的令牌
generateSessionToken();
?>
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表