pikachu漏洞练习第一章节验证码绕过onclient,onserver练习收获

练习部分

验证码的作用:防止登录暴力破解,防止机器恶意注册。

验证码的认证流程:客户端request登录页面,后台生成验证码;把输入的验证码进行校验;客户端重新刷新页面,再次生成新的验证码。

验证码绕过on client

首先进入pikachu靶场第一章节验证码绕过(onclient),在网站中随意输入账号密码进行测试。

可见分别选择不输入验证码,输入错误的验证码,输入正确验证码但用户密码错误的三种情况中,网页弹出的提示分别不同。

打开brupsite利用proxy抓包,可以看到相比之前无验证码的登录方式,现在在请求中多了验证码的数据。

在pikachu网页右键选择查看网页的源代码

查看源代码找到验证码相关函数,观察可知此网站利用JavaScript在页面中利用createcode函数生成一个验证码,利用validate函数对验证码进行校验并弹出各项提示信息。

查看源代码的html部分,可见createcode函数被绑定给了input选框。由此可知该网页的验证码机制由前端的js代码负责,后端未对验证码进行验证。

回到burpsite把proxy中的请求,右键选择发送到repeater,在repeater模块中选中请求中验证码的部分,修改其数值为任意其他数字,点击发送进行测试

在发送之后得到响应,响应中进行查找源码,可见网页的响应不为之前我们测试中显示的验证码错误的提示信息,而是用户名密码错误的提示信息username or password is not exists。可知我们已经成功绕过了该验证码系统。

接下来重复pikachu漏洞练习第一章节基于表单的暴力破解步骤,在proxy中选中请求发送到intruder,在intruder选择clusterbomb攻击方式,把请求中的用户名密码静态数据替换为动态payload变量,设置不同payload集的字典,在payload设置中选择grepmatch,设置匹配项为username or password is not exists,最后开始攻击。

在得到攻击结果中单击username选项卡进行排序,可见只有两个申请请求项的结果不为1,且其响应长度也与其他结果不同,猜测这俩所使用的用户名密码即为正确的用户名密码。

将其输入至网页验证。成功登录网页。

验证码绕过on server

进入pikachu靶场第一章节验证码绕过(onserver),在网站中随意输入账号密码进行测试。

可见分别选择不输入验证码,输入错误的验证码,输入正确验证码但用户密码错误的三种情况中,网页弹出的提示分别不同。

我们使用刚刚针对client的验证码的思路,先使用proxy抓包,发送到repeater,修改验证码参数,发送请求,观察响应。可见响应中不像之前针对client的验证码时一样显示username or password is not exists,而是显示验证码错误。可知该验证码不能像之前那样绕过。

回到网页,刷新页面,在proxy中点击放行请求,回到网页,可见新的验证码被刷新了出来

我们把新的验证码输入到repeater,再次申请发送,在收到的响应中可见网页的提示信息由验证码错误变成了username or password is not exists。可知我们成功绕过了该网页的验证码系统。

我们把请求中的用户名密码改变,验证码不变,再次发送请求测试。在收到的响应中可见网页的响应依然是username or password is not exists。可知该验证码可以在不刷新的情况下反复使用不同的用户名密码进行验证。

在repeater中右键选择发送到intruder。接下来的操作就可以重复上文和之前第一章节第一题的步骤了,选择clusterbomb攻击,添加payload的位置,设置不同payload集的字典,设置grepmatch,开始攻击。

在攻击结果中可见两个成功登录的用户名密码对。

将其输入到网页中进行验证,成功登录网页。

以下是一个基于 PHP 语言实现的验证码防御机制示例代码,可以在Pikachu靶场中使用: ```php <?php session_start(); // 开启会话 // 判断请求是否为POST请求 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取表单数据 $username = $_POST['username']; $password = $_POST['password']; $captcha = $_POST['captcha']; // 判断验证码是否正确 if (strtolower($captcha) !== strtolower($_SESSION['captcha'])) { echo '验证码错误!'; exit; } // TODO: 进行登录验证 } else { // 生成验证码图片 $image = imagecreatetruecolor(100, 30); $bgcolor = imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $bgcolor); // 生成随机验证码 $captcha = ''; for ($i = 0; $i < 4; $i++) { $fontsize = 6; $fontcolor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120)); $fontcontent = rand(0, 9); $captcha .= $fontcontent; $x = ($i * 100 / 4) + rand(5, 10); $y = rand(5, 10); imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor); } // 保存验证码到会话中 $_SESSION['captcha'] = $captcha; // 输出验证码图片 header('Content-Type: image/png'); imagepng($image); // 销毁图片资源 imagedestroy($image); } ``` 上述代码中,首先通过 `session_start()` 开启会话,然后判断请求是否为POST请求。如果是POST请求,就获取表单数据,然后判断验证码是否正确,如果验证码不正确,直接输出错误信息。如果验证码正确,则进行登录验证,这部分代码需要根据具体情况进行实现。 如果请求不是POST请求,就生成验证码图片,并将验证码保存到会话中,然后将验证码图片输出给客户端。客户端在提交登录表单时,需要同时提交验证码。 这种基于服务器端的验证码防御机制,可以有效防止自动化程序对表单进行暴力破解攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值