在学习本章前,建议先对前序章节进行了解,传送门如下:
本章节结合靶场试验来仔细研究基于密码的登录机制中最常见的一些漏洞。
有缺陷的暴力破解防护
在攻击者成功入侵账户之前,暴力破解攻击可能会涉及许多失败的猜测。从逻辑上讲,防止爆破的防护手段主要是尽可能让自动化过程复杂并减慢攻击者尝试登录的速度,因此两种最常见防止爆破攻击的方法是:
●如果远程用户尝试登录失败次数过多,则锁定他们尝试访问的账户。
●如果远程用户连续快速登录尝试次数过多,则阻止远程用户的IP地址。
这两种方法都提供了不同程度的保护,但都不是无懈可击的,尤其是在防护上有逻辑缺陷的时候。
例如,如果多次登录失败,我们有时会发现自己的IP被阻止了。但在一些场景中,如果IP所有者可以成功登录,则失败尝试次数的计数器就会被重置。这意味着攻击者只需每隔几次尝试登录自己的账户即可防止被限制IP。
在这种情况下,只需要在整个字典列表中定期包含我们自己的登录凭证就可以让这种防御毫无用处了。
场景试验-突破IP锁定的防爆机制:
https://portswigger.net/web-security/authentication/password-based/lab-broken-bruteforce-protection-ip-block
场景说明:
这个场景由于密码防爆破的逻辑缺陷,容易受到暴力破解攻击,这里提供了一个可预测密码的字典,另外还提供了可正常登录使用的账户和密码,可以在场景列表中找到。
试验目的:
要完成这个试验,暴力破解该用户的密码,然后登录访问他的账户页面。
攻击过程:
①访问登录页面后可以发现,连续提交3次错误登录,IP地址就会被暂时阻止。但是如果我们在这个限制生效之前成功登录自己的账户,就可以重置失败登录的计数器。我们先把登录请求发送给Intruder,发送两次创建两个自动攻击,一个是正常可登录的用来重置IP限制的,另一个是用来猜测carlos密码的。
②先构造正常登录访问的,清除所有变量后将用户名设置为变量,随后在Payloads处重复200次这个用户名,Resource Pool中设置每次一个连接,间隔1000毫秒,以此用来重置,配置完后先不要发起攻击
③构造另外一个猜解密码的Payload,清楚所有变量后将密码设置为变量,随后在Payloads处将密码字典复制进去,在Resource Pool中设置跟前面的一致
④先点击前一个正常登录的攻击,然后再点击第二个猜测密码的攻击,攻击结果中查看响应码是302的密码,用carlos和此密码登录即可完成试验
试验小结:
这个场景所存在的逻辑缺陷其实就是在对爆破进行防护时不应该在成功登录后就重置失败次数,而是应该限定在一定时间内登录失败超过一定次数则立即锁定IP,即使中间有登录成功也不应重置失败次数。
账户锁定保护
网站试图防止暴力破解的另一种方法是在满足某些可疑条件时锁定账户,通常是一定次数的失败登录尝试。
锁定账户可以提供一定程度的保护,防止针对特定账户有针对性的暴力破解。但是这种方法无法充分防止暴力攻击,可以使用以下方法来解决这种保护:
1)首先建立一个有效的用户名字典;
2)其次确定一个我们认为一个用户可能拥有的非常小的密码字典。最关键的是,我们选择的密码数量不能超过允许登录尝试的次数;
3)通过自动化工具,使每个字典中的用户名尝试每个选定的密码,这样就可以在不触发账户锁定的情况下暴力破解每个账户。
当然上面这种方式主要对于弱密码的用户账户攻击会特别有效,如果密码有一定强度的话是比较难奏效的。
场景试验-突破IP锁定的防爆机制:
https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-account-lock
场景说明:
这个场景容易受到用户名枚举的影响,它使用账户锁定,但包含一个逻辑缺陷。
试验目的:
要完成这个试验,首先枚举一个有效的用户名,暴力破解该用户的密码,然后登录访问他的账户页面。
攻击过程:
①研究登录页面后可以发现,当用户名或密码不正确时,会出现:
"Invalid username or password."
但如果是存在的用户名,多尝试几次错误登录后,用户名就会被锁定:
"You have made too many incorrectlogin attempts."
利用这个特性,我们可以先来枚举用户。对所有字典中的用户尝试登录5次,使其被锁定,从响应包中抓取锁定信息。
②将请求发送给Intruder后进行改造,在Positions选项卡中修改攻击模式、清除所有变量后,将用户名设置为变量,在密码后面加上一个空变量
③随后在Payloads选项卡中,第一个变量将字典的用户名粘贴进去,第二个变量设置为空,循环次数为5
④在Options选项卡中,配置Grep-Match,将锁定用户名的关键语言插入,随后开始攻击
⑤从攻击结果中找到特殊响应的那个,前面那个就是被枚举出来系统中存在的用户名,记录下这个用户名
⑥重新构造下Intruder中的攻击语句,在Positions选项卡中更改攻击类型、清除所有变量,将用户名指定为刚枚举出来的那个,将密码设置为变量
⑦在Payloads选项卡中,将密码字典粘贴进去,随后开始攻击
⑧从攻击结果中可以看到,有一个密码没有反馈账户锁定的信息,可以确认这个就是正确的密码
⑨使用枚举出来的用户名和这个密码通过登录页面成功登录,完成试验。
试验小结:
这个场景最大的问题就是出在枚举用户的防护策略,应该对所有登录不成功的请求尽量保持一致的响应,不一样的响应机制及容易被攻击者利用。
SQL注入攻击-利用UNION检索其他数据(上)
SQL注入攻击-检索隐藏的数据
HTTP高级请求走私-HTTP请求隧道(上)
HTTP高级请求走私-CRLF的利用(上)
HTTP高级请求走私-响应队列中毒
HTTP请求走私漏洞-漏洞利用场景(上)
HTTP Host头漏洞-密码重置投毒
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):身份验证漏洞-基于密码的登录漏洞(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论