实验环境:

攻击机:

Burp

靶机:

lzctf.thecat.top

PHP+Mysql+中间件(容器)实验环境搭建这里就不多赘述了。

基本概念和原理:

概念:“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。
其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。
为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。

连续性尝试+字典+自动化(成功率不是100%)

字典:一个有效的字典可以大大提高攻击效率

  • 常用的账号密码弱口令(TOP500的用户名&&密码)
  • 互联网泄露的被拖库的账号密码
  • 通过软件生成的密码字典

漏洞形成的原因:

如果一个网站没有对登录接口实施放暴力破解措施(无失败错误限制等),或者实施了不合理的措施(验证码形同虚设)。

漏洞复现&&利用方法:

攻击流程:

  • 确认登录接口的脆弱性

确认目标是否存在被暴力破解的的可能性。

比如:尝试登录抓包——抓包——观察报文(判断是否存在暴力破解的可能)

  • 对字典进行优化

根据实际情况进行优化,提高爆破效率

比如:1)根据注册提示信息进行优化、2)管理后台爆破(admin/root/administered...)

  • 工具自动化操作

配置自动化工具(比如线程、超时时间、延时时间、重放次数等)

BURP暴力破解使用:

Proxy模块:抓包-丢包-放过

intruder模块:根据对应策略进行自动化重放。(常用于自动化猜解、暴力破解)

  • target选项卡:设置攻击目标,可以通过proxy发送
  • Pasitions选项卡:指定需要暴力破解的参数并且设置成变量,同时选择攻击模式:

Sniper:狙击手

设置一个Payload,先将第一个变量使用字典进行测试。然后再将第二个变量使用字典进行测试。

Battering ram:冲撞车

设置一个Payload,然后所有的变量使用字典内容被替换,然后一起尝试。

Ptichfork:草叉型

每个变量设置一个Payload,分别使用对应的字典对变量进行同时替换爆破;一一对应。

Clustering bomb:集束炸弹

需要为每个变量设置一个Payload,分别使用字典内容组合对变量进行替换。

Payload选项卡:设置字典,并可以对字典进行统一的策略处理。

Options选项卡:对扫描的线程失败重试进行配置;对结果设置匹配的Flag:通过一个标识符来区别结果,并在结果栏中结果出来。

基于表单的暴力破解

开启抓包——登录框随便输入账号密码登录——将数据包发送到intruder模块进行爆破;

将字段长度排序 特殊长度字段,看到返回数据包中带有login success字段 说明爆破成功。

基于验证码的暴力破解

聊一聊“验证码”

你的验证码真的安全吗???

基于前端JavaScript校验验证码绕过

上实验:

发现某站后台登录含有验证码,

输入错误的验证码网页——>>验证码输入错误哦!

不输入验证码——>>验证码不能为空哦!

说明必须输入正确的验证码才能登录。

这个时候右键查看源代码,发现验证码只是在前端进行了校验。


    var code; //在全局 定义验证码
    function createCode() {
        code = "";
        var codeLength = 5;//验证码的长度
        var checkCode = document.getElementById("checkCode");
        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++) {
            var charIndex = Math.floor(Math.random() * 36);
            code += selectChar[charIndex];
        }
        //alert(code);
        if (checkCode) {
            checkCode.className = "code";
            checkCode.value = code;
        }
    }

    function validate() {
        var inputCode = document.querySelector('#bf_client .vcode').value;
        if (inputCode.length <= 0) {
            alert("请输入验证码!");
            return false;
        } else if (inputCode != code) {
            alert("验证码输入错误!");
            createCode();//刷新验证码
            return false;
        }
        else {
            return true;
        }
    }


    createCode();

知道 是前端校验了,那么还需要测试后端是否进行了校验。

开启抓包——登录——将数据包发送到Repeater模块;

对验证码进行删除、修改发包 。经过测试后发现返回包里出现了账号或密码错误(username or password is not exists~)的提示。从中我们可以判定验证码仅仅是前端做了校验,传入后端并没有进行校验。

错误验证码:

删除验证码:

依旧使用Clustering bomb模块进行爆破即可。

基于服务端SERVER校验验证码绕过

保持BURP抓包状态

发现某站后台登录含有验证码,

输入错误的验证码网页——>>验证码输入错误哦!

不输入验证码——>>验证码不能为空哦!

审查元素发现 如下代码

发现验证码是在网页刷新的时候生成的;那么如果保持网页不刷新验证码不刷新的状态使用burp进行爆破是否可行呢???

经过Repeater模块的删除、修改验证码,发包测试说明。验证码传入后端进行了判断校验。

验证码为空的情况:

验证码为错误的情况:

但是保持网页不刷新的情况下,数据包中带入正确的验证码 爆破发现爆破成功,说明验证码不失效。

成功:

Token防爆破?

Token并不能防止爆破。

  1.    首先在靶场中选择token放爆破?模块,在用户名和密码栏中随意输入一个用户名和密码,打开Burp Suite并开启截获功能,抓取数据包。
  2.    将所得数据包发送到Repeater模块测试是否除了验证码、用户名和密码外还有token保护。
  3.    将数据包发送到Intruder模块将线程设为1,然后给用户名、密码和token添加变量,此时我们要设置一个针对token的字典,点击options勾选grep-extract并点击添加,在弹出的窗口中点击refetch在得到的数据包中找到token值并选中,此时会自动填充值,然后点击ok。如此就得到了一个针对于token的字典。

  4.    此时我们将爆破方式改为Pitch fork,给用户名和密码添加常规字典,在给token添加变量是选择recursive grep,使用刚才得到的字典,在下方的框中输入未被使用的token值。


![](https://cdn.jsdelivr.net/gh/lateral404/image/image/20200805073008.png)

## 后台代码分析:

## 防范措施:

* 是否强制要求用户设置复杂密码;
* 是否每次验证都使用安全的验证码;
* 是否对尝试登录的用户的行为进行判断&&限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
* 是否在必要情况下采取了双因素认证;
* ...等
最后修改:2020 年 11 月 06 日 04 : 32 PM