暴力破解的产生是由于服务器端没有限制,导致攻击者可以通过暴力的手段破解所需信息,比如用户名、密码等。
如果破解一个四位数字的验证码,那暴力破解的范围就是0000~9999,所以暴力破解需要一个庞大的字典。 一般我们用 burpsuite 的
intruder 模块进行暴力破解,它可以通过文件方式载入 .txt 文本的字典。关于字典可以到网上下载,样式非常多。
暴力破解的原理就是通过字典里已有的那些字符去一个个尝试登录,理论上说,只要字典足够大,这样的穷举就能够成功。
不过字典越大,工具尝试的次数就越多,那消耗的时间就越长。
暴力破解流程
尝试登录,进行抓包,查看数据包中的信息,观察含有的元素元素,比如可能含有token。
查看返回信息,确认目标是否存在暴力破解的可能。
暴力破解漏洞修复
1、如果用户登录次数超过设置的阈值,则锁定账号。
2、如果某个IP登录次数超过设置的阈值,则锁定IP。(这个方式有一个缺陷,可能一个IP有多个用户使用,那可能导致用户无法登录)
3、使用安全的验证码,比如通过发送手机验证码。
下面通过 pikachu 靶场中的暴力破解模块对几种暴力破解的方式进行测试。
进入可以看到一个登录界面。
先尝试登录,随便输入123/123,可以看到返回信息为不存在,也没有其他的什么验证机制。
用 burp 抓包,可以看到他的一些元素,只有账号和密码。
按 ctrl + i 把包发送到 intruder 模块进行暴力破解。
注意如果只爆破一个参数的话,选择 sniper 。但是我们这里需要爆破两个参数,就选择cluster bomb。
如果标记的信息不只是账号和密码或存在错误,那我们需要重新进行标记。
先点 clear 对标记进行清除,然后在选中我们要爆破的账号密码123/123点击 add 标记。
在playload 一栏中,payload set处选择2,即爆破2个参数。
进行载入字典,可以点 load 载入字典文件,也可以在 add 那一行进行手动输入可能存在的账号密码。
最后点击 Start attack 进行爆破,可以看到正在爆破的界面。
通过在length一项来判断,长度不一样的即为爆破成功的信息。
同样是一个登录界面,与前面相比多了一项验证码的输入。
尝试随便输入123/123/123,这里我们知道输入的三项都是错误的,但是返回信息只显示了验证码错误。
再尝试随便输入123/123,验证码按要求正确输入。
这个时候才回显了账号或密码错误。
进行抓包,可以看到数据中的参数与前面相比多了一项vcode,就是输入的验证码的参数。
这个时候,我们先随便输入账号密码123/123,输入要求的正确的验证码,然后按 ctrl + R 尝试发送到 repeater 模块测试回显。
在箭头所指的搜索栏进行搜索回显信息的关键字(前面我们已经测试了不同填写方式的两种回显),然后就可以看到成功回显了信息,指我们的 username or password 错误,但是验证码正确。
我们再尝试修改这条请求的信息,把账号或者密码修改一下,再次发送。
根据回显信息得知得到的仍然是账号密码错误,验证码正确的结果。
也就是说,我们现在抓到的这个包可以直接进行爆破,因为在这个包验证码是可以一直用的,和前面一样爆破账号和密码这两个参数。
回到代理界面,把包发送到 intruder 模块进行爆破,方法和前面一样。
界面中同样需要输入账号密码、验证码三项。
老样子,尝试随便输入123/123/123,可以看到有弹窗出现显示验证码错误。
按要求输入正确的验证码后,就回显了 username or password 错误。
在这之前,似乎和前面那题没有什么区别。
再用 burp 抓包看看,这里也和前面一样,有账号密码、验证码三个参数。
再把包发到 repeater 模块进行测试。
这个时候发现即使是错误的验证码,他的响应却没有显示验证码错误,而是显示 username 或 password 错误。
那这样就证明其实这个验证码是形同虚设的,后端不会对验证码进行验证。
既然验证码正不正确这个请求的响应都是一样的,那就可以直接去爆破了,爆破账号和密码这两个参数。
虽然到此可以进行暴力破解出账户和密码了,不过我们还可以了解一下这个验证码的源码。
在刚刚 repeater 模块测试的时候,可以在响应界面明显发现一串 JavaScript 代码,是与验证码有关的。
这里就体现了前面我们尝试验证码错误的时候是以弹窗的方式出现,而不是和前面一样在界面上回显信息。
而且这个验证码的验证是在客户端上实现的,后台不会对错误的验证码进行验证。
这个 JavaScript 代码里有 createcode() 和 validate() 这两个函数。
createcode() 函数会从0-9和26个大写字母中随机挑选5个作为验证码,然后用 validate() 函数去验证我们输入内容的准确性。
再回到 pikachu 网页,按 F12 查看源代码,用定位符找到验证码位置处的代码,可以看到每次出现验证码,都会调用createcode() 函数改变验证码。
进入看到是一个普通的登录界面。
随便输入123/123,看看是否有啥异常。
显示账号或密码错误,用 burp 进行抓包。
可以看到除了 username 和 password ,还有一个 token 参数。
token 参数就是用来防止暴力破解的,因为 token 是一个随机值,无法被破解。
pikachu靶场后面的 csrf 测试模块中也有 token 这个东西用来防 csrf 漏洞。