最近研究一下白帽子安全,主要关注WEB安全,在做完了常规的靶场xsslab、SQLI、DVWA、Pikachu后,了解了白帽子安全的基础知识。进一步开始用一些CTF来练习。本文是从BUUCTF网站上,去解一个WEB的Flag的详细记录。
0x00 打开BUUCTF,打开靶机
BUUCTF的地址在这里:BUUCTF在线评测 (buuoj.cn),进入后选择Basic->BUU BRUTE1.
选择BUU BRUTE 1后,创建靶机。
点击其中的靶机URL,即可打开靶机,进入对应的WEB程序。
Now, let's go to hack it!
0x01 对登录过程的初步分析
在进行爆破之前,分析一下这个登录界面的登录过程。如果在用户名和密码都未知的情况下,进行用户名、密码的组合尝试爆破,那么尝试次数非常庞大,假设用户名字典有10000个用户名,密码字典有10000个密码,那么意味着要进行10000*10000次的尝试。
如果能够单独先测试用户名,得到用户名后再测试密码,那么尝试次数会大幅度地降低,把尝试次数减少到10000*m+10000次(m为探测出的合法用户名数)。
能够做出判断的依据,是用户名错误、密码错误上,能不能从response中得到差异,只要能找到差异,就能够单独的进行用户名测试、单独进行密码测试。我们看看这一题中,差异在哪里(It's really obvious since it's a course!).
抓包看一下,会单独提示”用户名错误“,因此估计可以单独进行用户名的猜测爆破,找到合法的用户名。
找到合法的用户名后,即可指定合法用户名,再对密码进行爆破。
0x02 对用户名进行爆破,寻找合法用户名
打开靶机,输入一个用户名和密码;在BurpSuite上打开网络拦截,断住由浏览器访问靶机上的HTTP数据。
下面是BurpSuite断住的HTTP数据:
可以看到主要的可测试参数username和password。先对username进行爆破测试,密码维持me123456,不进行尝试。
为了对username进行爆破,对其添加payload positions,如下图:
下一步设置payloads的值,即确定用户名字典,以进行用户名的批量测试。
如下图:
a.Payload type
由于我们是从用户名字典文件里,提取探测的用户名列表;所以类型选择Simple List即可。后面的Reqeuest Count,提示的是进行探测的payload的数量。
b. Payload Options
由于从文件里导入用户名列表,所以选择”Load",选择好字典文件,自动会把文件里的内容加载得到列表里。
设置好position和payload后,启动爆破,start attack! But... 很快我们看到了不期望的情况:
Too Many Reqests! 服务端检测到过快的登录尝试,进行了屏蔽。猜测是短时间爆破的次数太多了,对应的解决方法,是减少并发线程数和每次访问的时间间隔。经过几次尝试,确定合理的线程数是1(单线程),时间间隔为100毫秒,即1秒钟进行10次尝试,不会导致服务端进行访问拦截。经过测试,找到了合法的用户名:
根据Length进行排序,找到返回长度显著异于其它请求的payload,打开对应的Response,内容为“ 密码错误,为四位数字”。 说明这个payload里的用户名,用户名合法,只是密码错误了。经过这个过程我们确定了两个重要信息:
admin是一个合法的用户名
密码是四位数字,从0000到9999.
依据这两个重要信息,进行下一步密码的爆破测试。
0x03 对登录密码的爆破,寻找正确的密码
在有了过程2的两个信息后,确定了下一步进行爆破的方向:对用户admin进行密码的探测。先对payload position进行修改,把尝试的位置,从用户名专项密码;同时把用户名设置为admin。
下一步设置payloads内容,清除上一步选择的用户名信息,设置密码的探测内容,由于密码为4为整数,所以在payload type里,我们选择类型为Numbers。如下图:
由于是四位整数,所以最小值为0,最大值为9999,设置递增步长为1,以探测每一个从0到9999的数字;由于密码为4位,所以对应不足四位的,需要以0补齐四位数。设置Min integer digits和Max integer digits的长度为4,设置小数点位数Min(Max) fraction digits为0. 此时可以在Example里,看到对应的payload的生成格式。
为了避免被服务端因访问频繁而阻断,依据探测name时的经验,设置线程数为1,访问间隔为100毫秒:
OK, Lets start attack! 我们从attack结果里,很快发现了一个与众不同的payload:
打开Response,看到内容:登录成功。flag{xxxx-xxx}, 拿着flag去靶机的页面输入,闯关成功。