pikachu靶场通关笔记03-验证码绕过(on client暴力破解)

目录

一、暴力破解

二、验证码客户端绕过原理

三、渗透准备

1、进入靶场

2、源码分析

3、构造字典

4、bp开启拦截并登录

5、bp抓包并发送到repeater

6、测试验证码功能

四、渗透实战

1、bp设置inception on

2、登录

3、配置intruder的positons字段

4、配置intruder的payload字段

5、开启攻击


本文通过《pikachu靶场通关笔记》系列,通过burpsuite的intruder模块完成暴力破解之验证码绕过(on client)关卡。

一、暴力破解

暴力破解是一种基于穷举法的安全威胁,其本质是认证系统存在的设计缺陷被攻击者利用。具体表现为:攻击者借助自动化工具系统性地尝试大量认证组合(如凭证、令牌或验证码),通过概率学方式突破身份验证机制。暴力破解成因主要包括如下方面。

  • 一是认证系统未实施尝试频率限制,允许无限次重试;
  • 二是缺乏多因素验证等纵深防御措施;
  • 三是错误信息设计不当,泄露过多系统反馈(如区分"用户名无效"和"密码错误")。
  • 四是用户设置的密码为弱密码,增大了暴力破解的成功概率。

二、验证码客户端绕过原理

暴力破解验证码客户端绕过的原理就是验证码仅在客户端校验(无服务端验证),原理如下所示。

  • 验证码的校验仅由前端JavaScript完成,提交表单时服务端未二次验证。
  • 攻击者可通过禁用JS、修改前端代码或直接伪造请求绕过验证码。

三、渗透准备

1、进入靶场

打开pikachu靶场之基于client端的暴力破解,点击右上角的提示,如下图所示。

http://192.168.59.1/pikachu/vul/burteforce/bf_client.php

由于pikachu的登陆系统都属于同一数据库,故而用户名和密码依旧如下所示。 

admin/123456 
pikachu/000000 
test/abc123

2、源码分析

如上图所示右上角提示查看源码,向下滑到到底,发现本关卡是使用客户端生成的验证码功能。

接下来对于客户端JavaScript生成的验证码进行详细分析,注释过的代码如下所示。

// 定义一个全局变量 code,用于存储生成的验证码
var code; 

// 定义一个函数 createCode,用于生成验证码
function createCode() {
    // 初始化 code 变量为空字符串
    code = "";
    // 定义验证码的长度为 5
    var codeLength = 5;
    // 通过元素的 id 获取显示验证码的输入框元素
    var checkCode = document.getElementById("checkCode");
    // 定义一个数组 selectChar,包含了所有可能用于组成验证码的字符,有数字 0 - 9 和大写字母 A - Z
    var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

    // 通过循环生成指定长度的验证码
    for (var i = 0; i < codeLength; i++) {
        // 生成一个 0 到 35 之间的随机整数,作为 selectChar 数组的索引
        var charIndex = Math.floor(Math.random() * 36);
        // 从 selectChar 数组中取出对应索引的字符,并拼接到 code 变量中
        code += selectChar[charIndex];
    }
    // 这行代码用于调试,可弹出验证码的值,此处注释掉了
    //alert(code);
    // 检查是否成功获取到显示验证码的输入框元素
    if (checkCode) {
        // 为输入框元素添加名为 "code" 的类,可能用于样式设置
        checkCode.className = "code";
        // 将生成的验证码赋值给输入框元素的 value 属性,使其显示在输入框中
        checkCode.value = code;
    }
}

// 定义一个函数 validate,用于验证用户输入的验证码是否正确
function validate() {
    // 通过选择器获取用户输入验证码的输入框元素,并获取其输入的值
    var inputCode = document.querySelector('#bf_client .vcode').value;
    // 检查用户是否输入了验证码
    if (inputCode.length <= 0) {
        // 如果用户未输入验证码,弹出提示框提醒用户输入
        alert("请输入验证码!");
        // 返回 false 表示验证失败
        return false;
    } else if (inputCode != code) {
        // 如果用户输入的验证码与生成的验证码不匹配
        alert("验证码输入错误!");
        // 调用 createCode 函数刷新验证码
        createCode();
        // 返回 false 表示验证失败
        return false;
    }
    // 如果以上条件都不满足,说明用户输入的验证码正确,返回 true 表示验证成功
    else {
        return true;
    }
}

// 页面加载时调用 createCode 函数,生成并显示初始的验证码
createCode();

 上述代码主要实现了一个简单的客户端验证码生成与验证功能,具体如下:

  • 验证码生成createCode 函数随机从数字 0 - 9 和大写字母 A - Z 中选取字符,拼接成一个长度为 5 的验证码字符串,将其存储在全局变量 code 中,并显示在 id 为 checkCode 的输入框里。
  • 验证码验证validate 函数会获取用户在特定输入框(#bf_client .vcode)输入的验证码,先检查输入是否为空,若为空则提示用户输入;接着对比输入的验证码和全局变量 code 存储的验证码,若不一致则提示输入错误,并刷新验证码;若输入正确则返回验证成功。
  • 初始加载:页面加载时调用 createCode 函数,生成并显示初始的验证码。

不过,该实现存在安全风险,验证码的生成和验证都在客户端完成,易被攻击者绕过,在实际开发中建议将其放在服务器端处理。

3、构造字典

构造暴力破解的用户名字典user.txt、密码字典password.txt。

(1)用户名字典user.txt内容如下所示。

admin
root
liujiannan

(3)密码字典password.txt内容如下所示。

123456
000000
ljn
999999

用户名密码和密码字典如下所示。 

4、bp开启拦截并登录

firefox打开pikachu靶场,开启bp代理抓包,进入基于服务端的暴力破解界面,输入用户名、密码和验证码并点击登录。

点击登录后,发现验证码发生变化,即客户端的验证码在每次点击login后发生变化。

5、bp抓包并发送到repeater

burpsuite抓包后,在http history历史记录中找到此post报文,点击选中此报文,并将报文送到repeater,具体如下图所示。

6、测试验证码功能

将报文发送到repeater,测试报文验证码功能。既然报文现在走到了bp模块,已经绕过客户端的验证码的校验,但是仍然需要验证到底服务端是否检查验证码。

(1)测试无密码的情况,发现服务端检测密码是否为空,无法通过此绕过登录检测

(2)测试无用户名的情况,发现服务端检测密码是否为空,无法通过此绕过登录检测。


(3)测试验证码为空的情况,发现服务器可以检查出用户名和密码不匹配,并未识别出无验证码的情况。 

(4)输入正确用户名,正确密码,错误验证码,发现登陆成功,服务器并没检测到验证码错误,即服务器未进行验证码校验 

 

(5)此时回到浏览器端,尝试输入错误验证码,发现浏览器端提示验证码错误,说明至少在客户端是校验验证码的。

(6)客户端不输入验证码直接点击登录,发现浏览器端提示需要输入验证码.

(7)此时在bp中查找刚刚输入错误和没有输入验证码的报文,发现bp并未抓到此两个报文,这说明刚刚的校验是在客户端完成验证码的校验。即pikachu的验证码绕过(on-client)关卡仅仅是客户端校验成功后,才可以被bp抓到。而发到bp的报文,无论验证码是什么,服务器端都不对其进行校验。基于此,我们只需要在浏览器端输入正确的验证码,即可将报文发送给bp,对其进行暴力破解。

四、渗透实战

1、bp设置inception on

由于点击login后验证码会更新,但是发送至bp后验证码不会发生变化,故而将bp的inception设置为inception on。

2、登录

由于验证码在客户端生成且在客户端验证,故而进入基于客户端的暴力破解界面,输入个性化的用户名密码,并输入正确验证码,并点击login,此时bp拦截到报文,将其发送到intruder.

3、配置intruder的positons字段

在burpsuite intruder中的intruder中配置positons,注意:
(1)    选择集束炸弹cluster bomb。
(2)    两个payload分别选择username和password对应的值。

4、配置intruder的payload字段

(1)参数payload1配置截图


 
(2)参数payload2配置截图

5、开启攻击

点击start attack后效果如下所示,在intruder result中找到长度不同的用户名密码对,点击此项目对应的response render使显示图形化登录结果,通过暴力破解渗透成功获得用户名admin、密码123456。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mooyuan天天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值