萌新小白猫学习BurpSuite的第一课。
一、测试环境
1.pikachu靶场
使用Windows7虚拟机运行Pikachu靶场,IP地址为192.168.10.7。
一共有4个暴力破解模块,试一试能过几关。
2.攻击工具
Windows 10虚拟机,IP地址为192.168.10.2。
Burp Suite Professional,安装好JDK,设置好Proxy就可以开始了。
二、基于表单的暴力破解
Step 1.原理分析
登录页面很简洁,只有Username和Password两个表单,尝试填入123/123,提示:username or password is not exists ~
先开启BP,抓包看看情况。
可以看到提交了username和password两个表单,Login是固定的,不用管他。
我们点击Login发送后,username和password的值就会传到服务器进行验证,当然验证是错误的,就返回了username or password is not exists ~
Step 2.进行攻击
由于只涉及到username和password两个变量,我们可以利用BP的Intruder模块,进行暴力破解。
右键将Reques Send to Intruder
Attack type = Cluster bomb
选中两个变量为username和password的值,Add高亮。
Payload 1 导入username字典,Payload 2 导入password字典。
其他的不用动了,直接点击Attack!!!
Step.3 获取成果
因为Cluster bomb的攻击模式会对两个字典所有的匹配情况进行遍历,所以结果就是Payload1和Payload2的积。
总共有450个。
因为验证正确和验证错误的Response长度一般会不一样,所以直接Length排序,可以找到正确的用户名和密码。如果凑巧是一样的长度,还可以设置关键字去筛选。
我们找到了3组用户名和密码,admin/123456,test/abc123,pikachu/000000,这里有个小失误,字典没有去重,所以出现了两个test,不过无伤大雅,成功攻破第一关。
三、验证码绕过(on server)
Step.1 原理分析
可以看到比上一个模块,多了一个验证码表单,下面还有一个图形验证码。
尝试输入用户名密码和验证码,发现会返回两种提示。
如果是验证码错误,那么会提示:验证码输入错误哦!如果是验证码正确,那么再验证用户名和密码,因为是随便输的,所以返回username or password is not exists ~
我们再抓包看一下。
比上次多提交了一个vcode,服务器返回错误后,验证码更新了。这样就不能像上次一样暴力破解,要想想新的办法。
我们试着把Intercept打开看看。
我们截获了一些数据包,分析一下情况。
这个和正常的验证没什么区别,但是我们发现后面又接了一个GET。
这个GET是什么作用呢,我们可以看到他是发给服务器,关闭本次Connection,这样这个验证码就会作废了,页面会重新刷新验证码。
目前BP是截获了这个GET,还没发出去,所以我们可以看到页面的验证码是空白的,并没有刷新。
把这个GET包Forward出去,验证码果然刷新了。
简单猜想一下,如果我们截获GET不发送,服务器没收到关闭会话的包,本次会话一直保持,那么服务器将不会更新验证码,这个验证码在本次会话关闭前一直有效!!!我们可以利用一次会话尝试多次破解。
Step.2 进行攻击
所以这次攻击要开着Intercept,不然验证码就更新了。
设置攻击方式和第一次差不多,Attack type = Cluster bomb,username和password的值Add高亮。Payload导入字典。
其他的不用动了,直接点击Attack!!!
Step.3 获取成果
果然,服务器一直保持这个会话直到攻击结束。
成功找到了3组用户名和密码,test/abc123,admin/123456,pikachu/000000,第二关通过。
三、验证码绕过(on client)
Step.1 原理分析
可以看到和上一个模块差不多,验证码是灰色的,按一按还会变。
尝试输入用户名密码和验证码,发现验证码错误会弹出窗口提示你。
但是,我们发现,BP并没有抓到包,排除BP可能设置错误的问题,我们发现,不管是点击更新验证码,还是提交错误的验证码,浏览器都不会发送请求给服务器。
只有验证码正确的情况下,才会发送POST到服务器。
服务器没有发送和接受任何数据,但是验证码又验证了,只能说明这个验证码是本地产生和验证的。
尝试页面F12查看源代码,果然找到了一段JS代码。
bf_client.php的这段代码,表明验证码是本地生成并验证的。只有验证码对了,才会POST到服务器,所以可以想办法绕过这个验证码。
猜想一下,既然验证码是在本地生成的,服务器并不知道验证码是多少,所以只要我们提交了格式正确的POST,那么服务器就会默认验证码是正确的,从而返回用户名和密码的验证信息。
而且,验证码错误的话,本地页面会阻止我们提交POST,所以我们可以直接用任意验证码的POST包,直接发给服务器,这样就绕过了本地页面的验证机制,服务器就直接被耍了。
Step.2 进行攻击
试试就逝世,随便抓个包,随便填个验证码,ABCDE就挺好的,其他设置照旧。
就是这么随意,Attack!!!
Step.3 获取成果
果然,服务器完全不验证的。
成功找到了3组用户名和密码,test/abc123,admin/123456,pikachu/000000,第三关通过。
四、token防爆破
Step.1 原理分析
简而言之,token其实就是一种用于身份验证的令牌,用了一次就失效了,所以可以防止重复提交POST的暴力破解。
那么,我们看看有没有什么漏洞可以钻吧。
表面上看来平平无奇,和第一个页面差不多,但是没这么简单的。
除了用户名和密码,还提交了一个token,而且看上去很复杂的样子,但是服务器是怎么验证这个token的呢?
我们在服务器返回的Response里找到了一个token,但是这两个值明显是不同的。服务器为什么会发一个不一样的token回来呢?
我们再试着登录一下,抓个包分析一下。
可以很明显的看到,第二次POST的token,正是第一次服务器发给本地浏览器的token。
所以这个逻辑就很清晰了,服务器每次都会发送一个新的token给本地浏览器,用于下一次登录的token验证,如果不一致,说明这个POST是非法的,会被服务器拒绝。
我们可以用Repeater模块验证一下上面的猜想。
重放的结果,只有浏览器看的懂,所以可以Show response in Browser。
http://burpsuite/show/1/2qq7izt0b62dx3p1ghe0mwd7touhxu3n
果然,提示token错误。如果按照之前的方法,是无法成功验证token的,所以我们可以想一想,如何解决这个问题。
那就是使用BP截获服务器返回的token,然后放在下一次的POST进行攻击,幸好强大的BP有这个功能。
Step.2 进行攻击
攻击模式选择Pitchfork,这次是设置2个不同的Payload,所以Add的顺序一定要注意不要搞乱了(之前的也不要)。
注意用户名和密码要全选上哦。
设置Payload,因为第一个变量包含了用户名密码,中间还有一段多余的&password=,所以需要切成三块。
Position1,就是用户名字典, Position2,是固定的&password= Position3,就是密码字典。 这样第一个Payload就是三个部分的组合。
因为整个字段里有=和&,所以要把这个地方的=和&删掉,不然就都过滤了。
下面这步是关键,Settings里面设置Grep-Extract,点击Add,找到token的位置,刷新一下,把token值选中,然后点OK。下面的Redirections要选Always。另外token的初始值要复制过来。
然后回来设置Payload2,选择Recursive,刚才抓取的代码就自动过来了,把初始值填在下面,打个勾就行了。
最后Resource Pool要设置成单线程,只能按顺序一条条提交,不然token就乱了,单线操作还是稳的。因为跑了两个虚拟机,还开了一堆东西,服务器响应比较慢,我直接开到100ms慢慢跑。
先去吃个淄博烧烤,回来看结果。
Step.3 收菜
虽然麻烦了点,但是还是成功破解了token,闯关成功。
五、总结
BurpSuite爆破的几种模式:
| 攻击模式 | Payloads | 攻击效果 |
|---|---|---|
| Sniper | 1 | 一个参数不变,另一个遍历字典 |
| Battering ram | 1 | 两个参数同步遍历一个字典 |
| Pitchfork | N(取决于参数有几个) | 两个参数同步遍历两个不同的字典 |
| Cluster bomb | N(取决于参数有几个) | 两个字典的笛卡尔积 |