加载中

等一下,英子马上到

文章背景图

Yakit 测试 PortSwigger 靶场 - 未授权访问

2026-05-29
4
-
- 分钟
|

1. 环境

靶场地址:https://portswigger.net/web-security/learning-paths/authentication-vulnerabilities
用户名字典:https://portswigger.net/web-security/authentication/auth-lab-usernames
密码字典:https://portswigger.net/web-security/authentication/auth-lab-passwords
Yakit 地址:https://www.yaklang.com/

每次新开的实验环境的用户名密码都是随机的,因此每个人爆破出来的可登录用户名和密码都是不一样的。

2. Lab: Username enumeration via different responses

实验地址:https://portswigger.net/web-security/learning-paths/authentication-vulnerabilities/password-based-vulnerabilities/authentication/password-based/lab-username-enumeration-via-different-responses#

随意输入一个用户名和密码进行登录测试,可以发现提示”Invalid username”,说明可以对用户名进行枚举:

username={{file:line(D:\Apps\Yakit\Yakit\yakit-projects\temp\tmp3168031194.txt)}}&password=123

发送请求后观察响应大小,其中最大的一个响应包为”Incorrect password”,说明这个用户名是存在的:

alt text
alt text
username=appserver&password={{file:line(D:\Apps\Yakit\Yakit\yakit-projects\temp\tmp1905317715.txt)}}

唯一的一个 302 状态码为登录成功的响应:

alt text

最终用户名和密码为 a

alt text

随机输入一个用户名和密码进行登录测试,提示”Invalid username or password.”,无法确认用户名是否存在,但可以考虑通过观察响应时间来进行用户名枚举,因为如果用户名存在,服务器可能会进行密码验证,导致响应时间较长;如果用户名不存在,服务器可能会直接返回错误消息,响应时间较短,同时可以将密码设置长一些,例如 100 个字符,这样可以延长正确用户的响应时间:

username={{file:line(D:\Apps\Yakit\Yakit\yakit-projects\temp\tmp133041859.txt)}}&password={{randstr(100)}}
alt text

遍历到第四个包后,提示”You have made too many incorrect login attem

alt text

” 草叉 / 同步”:

alt text

对响应时间最长的用户名进行爆破:

alt text

得出用户名和密码为 agent/tigger,成功登录后完成实验。

4. Lab: Broken brute-force protection, IP block

直接对目标用户 carlos 进行密码爆破:

username=carlos&password={{file:line(D:\Apps\Yakit\Yakit\yakit-projects\temp\tmp23
alt text

1 minute (s)

alt text

用的凭证 wiener:peter,可以考虑,如果成功登录,服务端是否会清除 IP 的封禁状态,尝试使用这个凭证进行登录:

alt text

可以正常登录,继续登录目标用户没有提示 IP 被封禁了,说明服务端在成功登录后会清除 IP 的封禁状态。

新开一个 web fuzzxer,不停循环登录 wiener:peter,以此来保持 IP 的封禁状态被清除,:

alt text

同时在另一个 fuzzer 中对 carlos 进行密码爆破,并发线程数设置为 1:

alt text

得到密码为 159753,成功登录后完成实验。

5. Lab: Username enumeration via account lock

使用任意用户名和密码进行登录测试,提示”Invalid username or password.”,无法确认用户名是否存在,但是根据题目的提示可以考虑,对用户名字典的每个用户名进行密码爆破,观察是否会提示账户被锁定,如果提示账户被锁定,说明这个用户名是存在的:

usern
alt text

使用交叉乘积进行爆破,并添加规则,丢弃包含”Invalid username or password.” 的响应:

alt text

azureuser 用户出现了账户被锁定的提示,说明这个用户名是存在的,接下来对这个用户进

alt text
D:\Apps\Yakit\Yakit\yakit-projects\temp
alt text

rname or password.” 以及”You have made too many incorrect login attempts. Please try again in 1 minute (s).” 的响应:

alt text

存在一个没有任何提示的响应,密码为 aaaaaa,成功登录后完成实验。

6. Lab: 2FA simple bypass

使用提供的凭据 wiener:peter 进行登录,提示需要输入 2FA 验证码:

alt text

点击 Email Client 获取验证码:

alt text

提交验证码后完成登录:

alt text

目标账户 carlos:montoya 也需要输入 2FA 验证码,尝试对验证码进行爆破:

mfa-code={{int(0-9999|4)}}
alt text

出现内部网关错误,说明无法爆破验证码

alt text

ter 后的页面 URL 为 https://0a83000d04d272f080b4946900b900d3.web-security-academy.net/my-account?id=wiener ,其中 URL 中的 id 参数值为当前登录用户的用户名,可以尝试将 URL 中的用户名替换为目标用户 carlos,访问 https://0a83000d04d272f080b4946900b900d3.web-security-academy.net/my-account?id=carlos

alt text

成功绕过 2FA 登陆进来。通过查看 HTTP 记录可以发现,在提交完用户名密码的后,服务端便直接下发

alt text

account?id=carlos,浏览器会自动携带刚才获得的有效 Session Cookie 发起请求,服务器端没有强制检查用户是否已经完成了 2FA 步骤,直接允许用户访问:

alt text

7. Lab: 2F

alt text

iener:peter 进行登录,通过 Em

alt text

的凭证,因此需要考虑,

alt text

okie 中的用户名替换为 carlos,以此触发获取 carlos 的 2FA 验证码:

alt text

渲染的页面出现了输入验证码的提示,说明 carlos 的 2F

alt text
sion=SscYjcjX1gq4IwoTlZOYqua3NizqAPJj

mfa-code={{int(0-9999|4)}}

无法对 GET /email 进行爆破,因为这个接口只是用来测试已知凭证 wiener:peter 的。

alt text

观察到存在 302 状态码的响应,说明验证码爆破成功了,右键在浏览器中打开 URL,即可成功登录 carlos 的账户。

评论交流

文章目录