pikachu靶场第三关-密码爆破之验证码绕过(on client)(附代码审计)

本文详细分析了一段PHP源代码,展示了如何通过表单进行密码验证,并介绍了前端验证码的原理和重要性。着重讨论了验证码在防止暴力破解和提升网站安全性中的作用,以及前端验证码的实现,包括使用javascript生成和验证的过程。

源代码如下:

if(isset($_POST['submit'])){
    if($_POST['username'] && $_POST['password']) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $sql = "select * from users where username=? and password=md5(?)";
        $line_pre = $link->prepare($sql);


        $line_pre->bind_param('ss', $username, $password);

        if ($line_pre->execute()) {
            $line_pre->store_result();
            if ($line_pre->num_rows > 0) {
                $html .= '<p> login success</p>';

            } else {
                $html .= '<p> username or password is not exists~</p>';
            }

        } else {
            $html .= '<p>执行错误:' . $line_pre->errno . '错误信息:' . $line_pre->error . '</p>';
        }


    }else{
        $html .= '<p> please input username and password~</p>';
    }


}

这源代码和第一关的一模一样,这里就不解释了。

详见:pikachu靶场第一关-密码爆破之基于表单的暴力破解(附代码审计)-优快云博客

那么这一关的验证码从何而来?又有什么意义呢?

验证码的作用:
验证码是防机器的,防止恶意破解密码、刷票、论坛灌水、刷页。有效的防止某个黑客以特定程序暴力破解的方式进行不断的登录尝试。
一种常用的CAPTCHA测试是让用户输入一个扭曲变形的图片上所显示的文字或数字,扭曲变形是为了避免被光学字符识别(OCR, Optical Character Recognition)之类的电脑程序自动辨识出图片上的文数字而失去效果。由于这个测试是由计算机来考人类,而不是标准图灵测试中那样由人类来考计算机,人们有时称CAPTCHA是一种反向图灵测试。

前端验证码:前端验证码是由前端浏览器生成的验证码,填完验证码后,先检查验证码正确与否,如果正确则向后端发送请求,调用后端接口。但是验证码放在前端,安全性不高。

第三关的密码爆破就是前端验证码,所以在后端的源码中并没有出现任何与验证码有关的代码。

我们来看一下前端的代码。

<script language="javascript" type="text/javascript">
    var code; //在全局 定义验证码
    function createCode() {
        code = "";
        var codeLength = 5;//验证码的长度
        var checkCode = 
由于没有具体的引用内容,以下基于一般的知识来分析pikachu靶场中可能与`onclick`(推测你想说的是`onclick`而不是`onclien`)相关的验证码绕过问题及解决方案。 #### 问题产生原因 在pikachu靶场这类安全测试环境中,验证码的作用是防止自动化脚本恶意操作。但当验证码相关逻辑与`onclick`事件存在漏洞时,就可能被绕过。比如,前端`onclick`事件处理函数可能没有正确验证验证码,或者验证码的验证逻辑完全依赖前端,没有在后端进行二次验证。 #### 常见绕过方式及解决方案 ##### 前端验证绕过 - **现象**:验证码的验证逻辑仅在前端`onclick`事件中实现,开发者在按钮的`onclick`事件处理函数里检查验证码是否正确,如果正确则提交表单。攻击者可以通过修改前端代码绕过这个验证。 - **解决方案**:验证码验证必须在后端进行。前端`onclick`事件可以做一些简单的格式检查,但最终的验证要依赖后端。以下是示例代码: **前端代码(HTML + JavaScript)** ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <form id="myForm" action="backend.php" method="post"> <input type="text" id="captcha" name="captcha" placeholder="输入验证码"> <button type="button" onclick="checkForm()">提交</button> </form> <script> function checkForm() { // 简单的格式检查 var captcha = document.getElementById('captcha').value; if (captcha.length === 0) { alert('请输入验证码'); return; } document.getElementById('myForm').submit(); } </script> </body> </html> ``` **后端代码(PHP)** ```php <?php session_start(); if ($_SERVER["REQUEST_METHOD"] == "POST") { $userCaptcha = $_POST["captcha"]; $correctCaptcha = $_SESSION["captcha"]; if ($userCaptcha === $correctCaptcha) { // 验证码正确,处理业务逻辑 echo "验证码验证通过"; } else { echo "验证码错误"; } } ?> ``` ##### 验证码重用绕过 - **现象**:在`onclick`事件触发后,验证码没有被及时更新,攻击者可以多次使用同一个有效的验证码进行提交。 - **解决方案**:每次验证码被使用后,在后端立即更新验证码。例如在PHP中,生成新的验证码并更新`$_SESSION`中的值。 ```php <?php session_start(); // 生成新的验证码 $newCaptcha = generateCaptcha(); $_SESSION["captcha"] = $newCaptcha; function generateCaptcha() { // 生成验证码的逻辑 $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $captcha = ''; for ($i = 0; $i < 6; $i++) { $captcha .= $characters[rand(0, strlen($characters) - 1)]; } return $captcha; } ?> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VW_浮生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值