Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — يُظهر ثغرة حرجة في قابلية توقع مفتاح توقيع JWT في خادم PowerJob، مما يسمح باشتقاق المفتاح دون اتصال وتزوير الرموز للاستيلاء على صلاحيات المسؤول وتجاوز مصادقة OpenAPI. | Kitploit
أدوات/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
تحليل الثغرات الأمنيةالاستغلالأمن الويباختبار الاختراقالمصادقة
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

يُظهر ثغرة حرجة في قابلية توقع مفتاح توقيع JWT في خادم PowerJob، مما يسمح باشتقاق المفتاح دون اتصال وتزوير الرموز للاستيلاء على صلاحيات المسؤول وتجاوز مصادقة OpenAPI.

عرض المستودع
منذ 24 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

مفتاح توقيع JWT في PowerJob يمكن التنبؤ به (مفتاح مشتق من عنوان JDBC الافتراضي) ← تزوير الرموز

1. الملخص

يتم اشتقاق مفتاح توقيع JWT (HS256) في خادم PowerJob عن طريق فك ترميز BASE64 لـ ثابت مضمّن في الكود مقترنًا بـ MD5 لعنوان JDBC الافتراضي (DefaultSecretProvider / JwtServiceImpl). عنوان JDBC عام في النشر الافتراضي (docker-compose / application-daily.properties)، لذلك يمكن للمهاجم اشتقاق المفتاح بالكامل دون اتصال وتزوير JWT صالح لأي مستخدم (بما في ذلك المسؤول)؛ كما يمكن تزوير رمز تطبيق OpenAPI لتجاوز مصادقة OpenAPI.

2. المنتج المتأثر

  • المنتج: خادم PowerJob (وحدة التحكم على المنفذ 7700 + OpenAPI)
  • الإصدارات المتأثرة: 5.1.2
  • النشر الافتراضي: application-daily.properties يكشف jdbc:mysql://powerjob-mysql:3306/powerjob-daily?... كنص صريح

3. موقع الثغرة

  • powerjob-server-auth/.../jwt/impl/DefaultSecretProvider.java:31-45: return md5(environment.getProperty("spring.datasource.core.jdbc-url"));
  • powerjob-server-auth/.../jwt/impl/JwtServiceImpl.java:44-102: ثابت BASE_SECURITY مضمّن في الكود؛ genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) ← Keys.hmacShaKeyFor
  • المفتاح يتشارك المستودع/قاعدة البيانات مع بيانات الأعمال؛ عنوان JDBC نص صريح في ملفات الإعداد/docker-compose.

4. السبب الجذري

  • يتم استخدام مفتاح يمكن التنبؤ به / اشتقاقه بدلاً من مفتاح عشوائي ومخزّن: يعتمد المفتاح فقط على ثابت عام + MD5 للعنوان الافتراضي العام.
  • حمولة JWT (username/encryptedToken) لديها فحص ثانوي لحسابات PWJB (DigestUtils.rePassword(password, username))، لكن:
    • مع كلمة المرور الافتراضية يمكن حساب هذه القيمة دون اتصال ← استيلاء كامل على حساب المسؤول؛
    • يمكن تزوير رمز تطبيق OpenAPI (الادعاءات appId/password/encryptType) مباشرة لتجاوز المصادقة (OpenApiSecurityServiceImpl:87-105)؛
    • حسابات تسجيل الدخول الأخرى من جهات خارجية قد لا تحتوي على فحص ثانوي.

5. إعادة الإنتاج (تم التحقق — شامل من البداية للنهاية)

البيئة: خادم PowerJob محلي (127.0.0.1:7700، عنوان JDBC jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true). المهاجم يشتق كل شيء دون اتصال من المعلومات العامة فقط:

root@kitploit:~
# ① اشتقاق encryptedToken (= rePassword(password, username))؛ يمكن حسابه مع كلمة المرور الافتراضية
rePassword("powerjob_admin", "ADMIN")
   = ADMIN_b82a450701f6a71723fb99931fe35e18_b      # مطابق بايتًا ببايت لقيمة DB user_info.token_login_verify_info ✅

# ② اشتقاق مفتاح توقيع HS256 = BASE64(BASE_SECURITY + MD5(JDBC_URL))
secret = BASE_SECURITY + md5(jdbc_url)             # مفتاح بطول 101 بايت

# ③ تزوير JWT ويب للمسؤول (الادعاءات: username=PWJB_ADMIN، encryptedToken=نتيجة ①، sub=PowerJob)

النتيجة الفعلية (الرمز المزوّر يجتاز المصادقة):

root@kitploit:~
[*] /namespace/list بدون رمز :
{"success":false,"data":null,"message":"PowerJobAuthException: UserNotLoggedIn","code":"-100"}

[*] /namespace/list مع JWT مزوّر :
{"success":true,"data":{"index":0,"pageSize":10,"totalPages":1,"totalItems":1,"data":[{"id":1,"code":"default_namespace","name":"default_namespace","dept":null,"tags":null,"extra":null,"status":1,"statusStr":"ENABLE","gmtCreate":"2026-08-07T13:07:32.000+00:00","gmtCreateStr":"2026-08-07 21:07:32","gmtModified":"2026-08-07T13:07:32.000+00:00","gmtModifiedStr":"2026-08-07 21:07:32","showName":"default_namespace(default_namespace)","token":"14e4ebff-9a79-4845-ac66-8b20c4dff2ee","componentUserRoleInfo":{"observer":[],"qa":[],"developer":[],"admin":[]},"creatorShowName":null,"modifierShowName":null}]},"message":null}

← الرمز المزوّر يصادق كمسؤول ويعيد بيانات حقيقية (الخط الأساسي مرفوض مع UserNotLoggedIn).

النقاط الرئيسية:

  • encryptedToken المشتق دون اتصال يطابق القيمة المخزنة في قاعدة البيانات بايتًا ببايت (ADMIN_b82a450701f6a71723fb99931fe35e18_b).
  • المفتاح محدد بالكامل بواسطة الثابت العام BASE_SECURITY + MD5 لعنوان JDBC الافتراضي العام ← يمكن اشتقاقه دون اتصال بدون أي بيانات اعتماد.
  • encryptedToken الخاص بـ PWJB يمكن إعادة حسابه دون اتصال مع كلمة المرور الافتراضية (powerjob_admin، النتيجة PJ-02) ← استيلاء كامل على حساب المسؤول.
  • إذا غيّر المسؤول كلمة المرور، يتم حظر تزوير رمز الويب بسبب عدم تطابق encryptedToken، لكن مسار رمز تطبيق OpenAPI (الادعاءات appId/password/encryptType، OpenApiSecurityServiceImpl:87-105) لا يزال يمكن تزويره بشكل مستقل لتجاوز مصادقة OpenAPI.

حتى إذا تم تغيير كلمة المرور الافتراضية، تستمر الثغرة عبر نواقل هجوم أخرى:

  • المهاجم الذي يحصل على encryptedToken لأي مستخدم صالح بوسائل أخرى (مثل حقن SQL، كشف نسخ احتياطية لقاعدة البيانات، تسرب السجلات، أو كشف معلومات من نقاط نهاية أخرى) يمكنه دمج هذا الرمز مع مفتاح التوقيع القابل للتنبؤ لتزوير JWT لذلك المستخدم المحدد.
  • هذا يتجاوز مشكلة عدم تطابق encryptedToken تمامًا، لأن الرمز المزوّر يحتوي الآن على encryptedToken مشروع مشتق من السجل الفعلي في قاعدة البيانات.
  • نتيجة لذلك، لا يحتاج المهاجم إلى معرفة كلمة مرور المستخدم النصية على الإطلاق، ويظل JWT المزوّر صالحًا حتى بعد تغيير المستخدم لكلمة مروره (حتى انتهاء صلاحية الرمز).

إثبات المفهوم: powerjob_jwt_key.py 192.168.49.128:7700

image
image

6. التأثير

  • تجاوز المصادقة / تزوير رموز لأي مستخدم ← أسطح إدارة وحدة التحكم / OpenAPI.

7. الإصلاح المقترح

  • قم بتوليد المفتاح عشوائيًا وتخزينه (ملف/متغير بيئة)، ولا تشتقه أبدًا من عنوان JDBC أو ثابت.
  • استخدم مفتاحًا منفصلاً لرموز تطبيقات OpenAPI مقابل رموز JWT للويب.
  • فرض الفحص الثانوي encryptedToken لجميع الحسابات.

8. CWE / CVSS

  • CWE: CWE-321 (استخدام مفتاح تشفير مضمّن في الكود) / CWE-798
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 حرج (مقترنًا بكلمة المرور الافتراضية / OpenAPI)
تنزيل الأداة