
SAML Single Sign On <= 5.4.4 - Contournement de l'authentification sans authentification via le paramètre SAMLResponse
SAML Single Sign On <= 5.4.4 - Contournement de l'authentification sans authentification préalable via le paramètre SAMLResponse
Exploit de preuve de concept
Signature malformée → openssl_verify() renvoie -1 → conversion souple PHP en true → wp_set_auth_cookie() en tant qu'Administrateur
| Champ | Détail |
|---|---|
| CVE ID | CVE-2026-15981 |
| Plugin concerné | miniOrange SAML 2.0 Single Sign On – SSO Login (WordPress) |
| Versions concernées | Toutes les versions jusqu'à la 5.4.4 incluse |
| Type | Contournement de l'authentification sans authentification préalable |
| CWE | CWE-287 : Authentification incorrecte / CWE-305 : Contournement de l'authentification par faiblesse primaire |
| CVSS 3.1 | 9.8 CRITIQUE — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Authentification | Aucune requise |
Le plugin SAML Single Sign On – SSO Login pour WordPress est vulnérable à un contournement de l'authentification dans toutes les versions jusqu'à la 5.4.4 incluse. Cela est dû au fait que la fonction mo_saml_validate_signature() effectue un contrôle booléen souple sur l'entier à trois états renvoyé par openssl_verify() de PHP, ce qui fait que la valeur d'erreur -1 est évaluée comme vraie et donc traitée comme une vérification de signature réussie.
Cela permet à des attaquants non authentifiés de se connecter en tant que n'importe quel utilisateur WordPress existant, y compris les administrateurs, en soumettant une SAMLResponse forgée contenant un NameID contrôlé par l'attaquant et une valeur de signature délibérément malformée qui déclenche une erreur de traitement OpenSSL — contournant entièrement la vérification et conduisant à l'appel de wp_set_auth_cookie() pour le compte ciblé.
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
Le correctif est trivial — if ($result === 1) au lieu de if ($result) — mais l'impact de la faille est un contournement total de l'authentification.
?option=mosaml_metadata/wp-json/wp/v2/users)/?author=N)?option=saml_user_login et extrait les URL de base de l'IdPlxml</Issuer> conformément à la spécification SAMLopenssl_verify() = -1wordpress_logged_in_* après chaque tentative/wp-admin/, /wp-admin/users.php, /wp-admin/plugins.php/wp-admin/profile.phpplugin-install.php/wp-json/wp/v2/pluginsNx-zD dans le corps de la réponsePython >= 3.8
pip install requests lxml
lxmlest requis pour une canonicalisation Exclusive C14N correcte de l'Assertion SAML.
python CVE-2026-15981.py
Vous serez invité à fournir :
| Paramètre | Description | Défaut |
|---|---|---|
| Fichier de cibles | Chemin vers un fichier texte contenant une cible par ligne | list.txt |
| Threads | Nombre de travailleurs concurrents (1–100) | 5 |
https://example.com
http://target.org
subdomain.example.net
192.168.1.100
https://example.com/wordpress
Une URL par ligne. HTTP est utilisé par défaut si aucun schéma n'est spécifié.
███████╗███╗ ███╗███████╗
██╔════╝████╗ ████║██╔════╝
███████╗██╔████╔██║███████╗
╚════██║██║╚██╔╝██║╚════██║
███████║██║ ╚═╝ ██║███████║
╚══════╝╚═╝ ╚═╝╚══════╝
╔══════════════════════════════════════════════════════════╗
║ miniOrange SAML SSO <= 5.4.4 ║
║ openssl_verify() -1 Bypass -> Admin Session ║
╚══════════════════════════════════════════════════════════╝
By: Nxploited ( Khaled Alenazi ) - Nxploited ZeroDay Hub
T.m @Kxploit
Chaque cible progresse à travers 7 étapes étiquetées :