免责声明: 此漏洞利用程序仅为已退役的 HackTheBox 机器 "Principal" 开发。仅供教育目的使用。请勿将其用于您不拥有或未经明确许可测试的系统。
| 字段 | 详情 |
|---|---|
| 名称 | Principal |
| 平台 | HackTheBox |
| 难度 | — |
| 状态 | 已退役 |
受影响的库: pac4j-jwt < 4.5.9 / 5.7.9 / 6.3.3
严重性: 严重
类型: 身份验证绕过
JwtAuthenticator 中的一个逻辑缺陷允许攻击者通过将未签名的 PlainJWT(alg=none)包装在 JWE(加密 JWT)内部来绕过身份验证。
当服务器解密 JWE 时,它会尝试将内部令牌解析为 SignedJWT。由于内部令牌是 PlainJWT,SignedJWT 对象为 null,签名验证被完全跳过。服务器随后从未经验证的声明中构建用户配置文件——允许完全冒充任何用户,包括管理员。
构造恶意声明(sub=admin, role=ROLE_ADMIN)
↓
构建未签名的 PlainJWT(alg=none)
↓
使用服务器的 RSA 公钥将 PlainJWT 包装在 JWE 内部
↓
向服务器提交 JWE 令牌
↓
服务器解密 JWE → 发现 PlainJWT → 跳过签名检查 → 授予访问权限
参见 exploit.py
将 pac4j-jwt 升级到已修补的版本:
4.5.9 或更高版本5.7.9 或更高版本6.3.3 或更高版本或者在 JWE 解密后明确拒绝 PlainJWT 内部令牌:
if (jwt instanceof PlainJWT) {
throw new CredentialsException("PlainJWT not allowed inside JWE");
}
/api/auth/jwks
alg: none使用公钥将其包装在 JWE 内部
发送为:
Authorization: Bearer <token>
pip install jwcrypto requests
python3 poc.py \
--jwks-url http://target/api/auth/jwks \
--target http://target/api/dashboard
[+] Forged Token:
eyJhbGciOiJSU0EtT0FFUC0yNTYi...
[+] Browser Injection:
sessionStorage.setItem("auth_token", "eyJhbGciOiJSU0EtT0FFUC0yNTYi...")
[+] Status: 200
{"user":{"username":"admin","role":"ROLE_ADMIN"}}
打开开发者工具 → 控制台:
sessionStorage.setItem("auth_token", "<PASTE_TOKEN_HERE>")
然后导航到:
/dashboard
alg: none 的令牌