PortSwigger - 身份验证漏洞
用户名枚举-通过响应时间
用户名枚举有多种方式,比如:
返回长度的差异
错误消息差异
响应时间差异(此例如下)
已知用户名 wiener
是存在的,先输入一个错误的密码,看看响应时间 357 ms
然后输入一个较长的密码,发现响应时间变长
这时我们就可以通过观察响应时间来枚举用户名
交替登录绕过 IP 封锁
防止暴力攻击的两种最常见方法是:
如果远程用户尝试登录失败次数过多,则锁定其尝试访问的帐户
如果远程用户连续多次尝试登录,则阻止其 IP 地址
这两种方法都提供不同程度的保护,但都不是无懈可击的,特别是如果使用有缺陷的逻辑来实现。
例如,有时您可能会发现,如果登录失败次数过多,您的 IP 就会被封锁。在一些实现中,如果IP所有者成功登录,则失败尝试次数的计数器重置。这意味着攻击者只需每隔几次尝试就登录自己的帐户,以防止达到此限制。
登录失败 3 次锁定 IP 一分钟
该程序的逻辑是登录成功后,会重置登录失败次数,所以我们可以不断地交替正确与错误的账号密码,来不断地重置登录失败次数以达到爆破的目的
就像这样,交替发包
找到了正确的账号密码
单请求多凭证绕过 IP 封锁
在上一个思路中,需要只要至少一个后台账号密码才可绕过该限制,如果我们什么信息都没有,可以尝试该骚操作。
普通爆破,错误几次就封锁 IP
将密码字符串替换为密码数组,登录成功。
2FA 简单绕过
使用 wiener:peter 登录,点击邮件客户端,查看验证码
输入正确的验证码后,进入个人中心页面,记录当前的URL:/my-account?id=wiener
登录 carlos:montoya,此时是需要验证码的,我们不知道验证码,但是我们可以访问 /my-account?id=carlos 绕过
2FA 逻辑错误
有时,双因素身份验证中存在缺陷的逻辑意味着用户完成初始登录步骤后,网站无法充分验证同一用户是否正在完成第二步。
登录 wiener 账号后,观察 2FA 验证过程
需要邮箱验证码,此时注意到 Cookie 中 verify=wiener,并且有一个 wiener 账号的 session 值。
猜测 verify 参数用于确定正在访问哪个用户的帐户,因此改为 carlos,向 carlos 发送验证码
随后,输入任意验证码,提交数据包到 Intruder
对验证码进行爆破,最后成功登录 carlos
2FA 验证码爆破(宏)
一些网站试图通过在用户输入一定数量的错误验证码时自动注销用户来防止这种情况。
观察登录过程,输入正确的账号密码后,还需要输入邮箱验证码
如果您两次输入错误代码,将被注销
需要使用 Burp 的会话处理功能在发送每个请求之前自动重新登录
打开设置 - Project - Sessions
添加宏,选择登录过程
添加规则
规则中选择创建的宏
登录 carlos:montoya,输入验证码进行爆破,因为有 CSRF 保护,所以要将线程调为 1,在执行宏时便会自动填充 CSRF
最后成功爆破出验证码
密码重置投毒
对重置密码过程进行分析,输入需要重置的用户名
然后我们将收到一封邮件,该链接中携带了 token
点击该链接,可进行密码重置操作
我们发现 X-Forwarded-Host 可以控制生成的重置密码链接
因此我们可以伪造 X-Forwarded-Host 值,受害者点击后,即可获取它的 token
向 carlos 发送邮件,成功获取其 token
然后就可以更改其密码了。
密码重置缺陷
先看一个数据包
正常我在测密码重置漏洞时,肯定是直接爆破前面两个参数
此时,原密码错误跳转到登录页面
如果新密码不一致,提示当前密码错误(后端不严谨导致),此时我们就可以爆破账号密码了
原密码爆破成功,将会提示新密码不匹配
密码重置缺陷 2
登录自己的账户
修改密码时填入当前密码
由于后端校验密码存在缺陷,将当前密码置空或者完全删除该参数,可修改任意用户密码