前期准备
环境:
web服务器采用Apache
数据库服务采用MySQL
靶场:
127.0.0.1/pikachu
爆破工具:
burp
字典:
账号:pikachu、test、admin
密码:000000、123456、test、abc123
复现
一、基于表单的暴力破解
使用基础的账号和密码,直接上bp工具
首先我们随意输入用户名admin密码123后抓包
然后找到Action选择择Send to Intruder
切换爆破模块可以看到成功发送后页面默认攻击类型为Sniper,代码有很多默认的标注,我们需要点击Clear$清空标记
首先我们分别选中username和password输入的数据进行标记,点击Add$,最后选择攻击方式Cluster bomb
然后设置playload在payload set 1位置,也就是username位置,上传关于我们的账号的字典,在2位置选择我们的密码字典
最后点击右上角start attack进行爆破
爆破结束后,我们可以根据返回数据长度来判断正确的账号密码,返回长度不同于其他数据包的,就是正确的账号密码。
二、验证码绕过(on server)
采用验证码,这关告诉我们验证码采用后端验证,并且可能存在验证码一直有效。什么意思呢,就是当页面刷新时,验证码才会发生改变,那我们只需要输入正确的验证码然后抓包再进行爆破用户名和密码。
验证一下是否存在上述问题
首先我们输入错误的用户名123密码123和正确的验证码hpltfj抓包如下
然后我们找到Action找到Send to Repeater模块
切换到重发模块,随便修改下密码点击Send看一下响应包里面验证码会不会改变
发现响应包验证码不会发生改变
那操作就跟第一关一样了。
发送到爆破模块,添加标注,选择Cluster bomb的方式、添加payload、攻击
三、验证码绕过(on cilent)
依然采用验证码,但是不同的是这关提示我们需要观察一下js的代码。发现在script标签中存在创建验证码和验证数据的方法
虽然看不懂但是大致能知道什么意思。首先随机生成一个验证码,然后判断输入的验证码和生成的验证码是否一致。当正确时返回true,错误时返回false。
那我们需要思考一下为什么会在前端验证,会不会当我们输入错误的验证码不管账号和密码是否正确页面都会刷新,这里输入账号:admin,密码:123456,验证码输入1结果如下:
试一下抓包,发现根本抓不到。哦~~!结合提示的内容基本上明白了。由于前端首先验证输入的验证码是否正确,然后才会将数据传到后端。那我们只需输入正确的验证码然后爆破账号和密码不就行了吗。
验证一下上述的问题
输入验证码RSPZX,抓包!
果然抓到了。此时你会发现跟第一关一样还是白给。
PS:这关可以采用浏览器禁用JavaScript的设置绕过验证码的方式来进行爆破,因为你的逻辑不是写在前端了嘛。
我们可以F12->找到设置(每个浏览器的设置位置都不太一样)->勾选禁用javascript
此时你会发现验证码不会生成,并且输入账号admin,密码123,抓包。然后操作还是跟第一关一样。
解释一下第二关和第三关的分别存在的情况
on server
你尽管输入内容,数据会在后端进行验证。也就是说你怎么输入我们通过bp都能抓到数据包,不管这个数据是正确的还是错误的,正确就会返回正确的结果,错误就会返回错误的结果。那么我们是不是只要验证这个验证码只有在刷新页面的情况下才会发生改变,此时仅需输入正确的验证码就跟第一关一样验证码不就是摆设吗。
on client
在js中可以看到你输入的验证码首先会在数据发送后端之前进行验证。如果正确我们才能抓到包,否则我们抓不到包。那么我们只需要输入正确的验证码才能抓包,此时跟第一关一样,也是白给。
四、token防爆破
什么是token?
"token"通常指的是一个用于验证用户身份和授权访问的令牌。它是一种特殊的字符串或代码,由服务器生成并分配给经过身份验证的用户。用户在成功登录后,服务器会颁发一个token给客户端(例如Web浏览器),客户端将在随后的请求中将该token作为身份验证凭据发送给服务器
对于有token的的验证,我们适用于已经知道账号的情况,或者账号和密码一一对应的情况,并且我们的暴力破解方式就要有所调整,我们依旧是先抓包,并发送到攻击模块
我们这里的攻击目标要选择password,以及token,攻击方式选择Pitchfork
下面我们来到payloads模块,password设置和之前一样,上传我们的爆破字典即可,第二个位置token处进行如下设置
我们首先来到Options模块,找到Grep Extract,点击add
点击Refetch response,查找token的值,并且复制,点击ok
我们再回到payloads模块,第二个位置选择Secursive grep(递归搜索),并且将我们刚刚复制的token粘贴到下面的框里,开始攻击即可。
如果出现下面情况
我们来到resource pool模块,选择创建新的资源池,并把最大请求数改为1
最后得到密码123456
总结
爆破模块的攻击类型有Sniper、Battering ram、Pitchfork、Cluster bomb。其作用和区别如下:
Positions攻击模式:
- Sniper:狙击手,表示如果爆破点设置一个,simplelist如果是6个,就执行6次,如果爆破点设置两个,则执行12次,一般这个模式下只设置一个爆破点,因为如果用户名和密码都不知道的情况下不会使用该模式去爆破。通常用于在知道用户名后,对密码进行爆破。
- Battering ram:工程锤,表示两个爆破点使用同一个play依次去执行,如果simplelist是6个,那么就执行6次。
- pitch-fork:叉子,这个模式下,表示两个爆破点,并且会设置两个payload1和payload2,payload1就设置给爆破点1,payload2就设置给爆破点2,总共也是执行6次。并且一般按照payload少的执行。
- 集束炸弹,表示如果有两个爆破点,同时设置两个payload1,和payload2,simplelist是6个和7个,那么就会执行一个笛卡尔积的次数。即就是42次。
常用有效载荷playload类型有Simple list、Runtime file、Custom iteractor、Character substituction、Recursive grep、Illegal unicode、Character blocks、Numbers、Dates、Brute forcer、Null payloads、Username generator、copy other payload。
- Simple list:简单字典
- Runtime file:运行文件
- Custom iteractor:自定义迭代器
- Character substituction:字符替换
- Recursive grep:递归查找
- Illegal unicode:非法字符
- Character blocks:字符块
- Numbers:数字组合
- Dates:日期组合
- Brute forcer:暴力破解
- Null payloads:空payload
- Username generator:用户名生成
- copy other payload:负责其他payload