Pikachu靶场通关记录一——暴力破解类

概述

“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括
1.是否要求用户设置复杂的密码
2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
4.是否采用了双因素认证;
…等等。

从来没有哪个时代的黑客像今天一样热衷于猜解密码 —奥斯特洛夫斯基

基于表单的暴力破解

看到是一个只需要输入用户名密码的简单登陆验证页面

在这里插入图片描述

尝试输入用户名密码后得到回显结果

在这里插入图片描述

错误提示没有指明是用户名还是密码出现错误,因此需要同时对这两个参数进行爆破

在这里插入图片描述

打开Burp Suite后设置好代理
我使用的是火狐浏览器中的FoxyProxy,选择绿色选项后即切换到代理模式

在这里插入图片描述

然后点击登录按钮,这样包含用户名密码参数的登录包才可以被Burp Suite抓取

在这里插入图片描述


切换到Intruder模块可以看到,Attack Type为攻击模式,选择cluster bomb,该模式下每个变量对应一个字典,并且进行交集破解,尝试笛卡尔积的各种组合,因此适用于本题的用户名密码爆破的场景。

该模块详细用法可以参考文章 BurpSuite系列(五)----Intruder模块(暴力破解)

在这里插入图片描述


因为我们爆破的对象是用户名密码,而Burp Suite会自动识别一些字段,这时候需要把不需要的绿色字段进行双击,然后点击Clear进行高亮的取消
调试完如图

在这里插入图片描述


到Payloads界面选择爆破字典

在这里插入图片描述

在这里插入图片描述

**一个超级无敌大坑!!!**选择字典的时候路径一定不可以带有中文,否则爆破过程会失败
失败例子见上一篇文章BurpSuite的Cluster Bomb模式下使用Runtime File爆破不成功解决办法——路径全英文

因为是两个参数,所以有两个Payload Set,要注意都要设置

字典根据自己的喜好来就行,像这种简单的题目就设置字段数少一点的字典,否则跑起来要很长很长时间
设置完成后Start Attack

在这里插入图片描述

因为登陆成功和登陆失败的界面回显肯定是不一样的,那么页面的长度也会不一样,所以筛选的时候就根据Length来

在这里插入图片描述

爆出了三对用户名密码

验证码绕过(On Server)

发现多了对验证码的验证

在这里插入图片描述

尝试输入错误信息后抓包

在这里插入图片描述

在传输的信息中发现有验证码的明文字

在这里插入图片描述


右键该包发送到Repeater,发包看页面回显

在这里插入图片描述

我们修改用户名密码再次发包,看看验证码是否发生变化

在这里插入图片描述


没有发生变化,错误回显界面都一样

也就是说验证码在判断完之后不会销毁,而是在页面刷新之后验证码才会刷新
只要我使用bp的重放攻击,页面是不会刷新的,那样就可以重复利用该验证码
验证码不用设置payload点,与当前页面显示的相同即可

可以进一步分析网页源码

if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
$html .= "<p class='notice'>验证码输入错误哦!</p>";
//应该在验证完成后,销毁该$_SESSION['vcode']
}else{
$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];
$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()==1){
$html.='<p> login success</p>';
}else{
$html.= '<p> username or password is not exists~</p>';
}

抓包步骤同上,设置用户名密码为爆破点,不再赘述

验证码爆破(On Client)

输入错误验证码看看

在这里插入图片描述

若输入正确的验证码

在这里插入图片描述


点击Login之后错误提示也不会消除

在这里插入图片描述


我们分析,验证码错误时有弹窗,而用户名密码错误时无弹窗
可以猜测验证码验证在前端,而用户名密码在后端
再来观察源代码

<script language="javascript" type="text/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;
        }
    }

在前端发现了检验验证码的JS脚本
既然是前端检测,那直接用burpsuite发请求报文绕过前端就可以了

所以还是抓包修改用户名密码进行爆破即可

token防爆破?

这里先了解一下什么是token。token是一种防爆破的方式,他通过在输入账号密码生成一个token,当进行账号密码验证时就会和其一起进行验证且如果token没有验证过的话是无法,而且每次刷新都会生成新的token。用这样的方式来进行防止和预防暴力破解。

在这里插入图片描述

使用Repeater发包直接重放发现提示token错误

在这里插入图片描述


删除token再次发包发现

在这里插入图片描述

但是看到其他大佬的文章,在登陆后的response界面查看源代码,发现有一个hidden类型的名为token的字段,里面是一段token值

在这里插入图片描述

与登陆前token值不同

在这里插入图片描述


怀疑是下一次登陆的token值
为了验证猜想我们就在下一次的登录抓包,然后把token值替换为我们截取的response的token值

在这里插入图片描述

果然只提示用户名密码错误

在这里插入图片描述


也就是每次登陆的token值都在上一次页面访问的响应包中

故还是选择暴力破解,这次的参数就需要加上token
选择Pitchfork模式,在该模式下每个变量对应一个字典,取每个字典的对应项
注意Attack type选Pitchfork(payload一一对应,数量为最少的payload的数量)。这里为啥要选Pitchfork而不能选Cluster bomb,因为Cluster bomb是三组payload排列组合,一个token用好几次显然不行。
对于token这个字段我们肯定是要设置他自己的规则的,所以不能把他设为cluster bomb,需要设置为Pitchfork分开跑字典

下面是步骤
1.设置username和password的爆破字典,同第一题
2.设置token的爆破,位置如下
首先Payload Sets设置为Recursive grep,代表递归查找

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


经过步骤可以看到自动生成左上角的正则表达式

在这里插入图片描述

点击OK即设置完成

此外还需要注意,线程必须设置为1

在这里插入图片描述

因为每次的token都是使用的上一次的,如果采用的是多线程会导致乱套
开始爆破,发现解不出来

在这里插入图片描述

由于前面使用的用户名密码payload列表都是适用于Cluster bomb的,而Pitchfork对payload的要求可能更高一些(需要提前整理好对应关系),所以只能把用户名密码payload列表改了一下。即提前安排好对应顺序,而不是笛卡尔积任意组合
于是我把用户名字典设置为了

admin
admin
admin
admin
admin
test
test
test
test
test
pikachu
pikachu
pikachu
pikachu
pikachu

密码字典设置为了

123456
abc123
000000
wwwwww
letmei
123456
abc123
000000
wwwwww
letmei
123456
abc123
000000
wwwwww
letmei

再次爆破

在这里插入图片描述

看来token对防暴破没啥用,因为总要让客户知道下一次用什么token的,因此总能被自动化工具获取
token的存在主要还是针对CSRF的。

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...