
CVE-2025-22352 の PoC
WordPressプラグイン
コンポーネント名 ELEX WooCommerce Advanced Bulk Edit Products, Prices & Attributes
脆弱性のあるバージョン <= 1.4.8
コンポーネントスラッグ elex-bulk-edit-products-prices-attributes-for-woocommerce-basic
コンポーネントリンク https://wordpress.org/plugins/elex-bulk-edit-products-prices-attributes-for-woocommerce-basic/
脆弱性クラス A3: インジェクション
脆弱性タイプ SQLインジェクション(ブラインドSQLインジェクション)
ショップマネージャー または 管理者
ELEX WooCommerce Advanced Bulk Edit Products, Prices & Attributesプラグインは、商品の一括編集をサポートするプラグインです。
このプラグインで商品を一括編集する際、フィルタリングによって対象が選択され、その過程で、商品フィルタリングリクエスト時に送信される一部のデータがSQLクエリに直接挿入されることでSQLインジェクションの脆弱性が発生します。
ただし、SQLクエリの結果を直接確認することはできず、クエリ結果の真偽を判定することでデータを抽出するブラインドSQLインジェクションの形で脆弱性が存在します。
/wp-admin/admin.php?page=eh-bulk-edit-product-attr)に移動します。上記PoCの説明でリクエストされた機能(「Preview Filtered Products」)を実行すると、以下のようなパケットが生成されます。

このパケットがリクエストされると、/wp-content/plugins/elex-bulk-edit-products-prices-attributes-for-woocommerce-basic/includes/elex-ajax-apifunctions.php ファイル内の elex_bep_filter_products 関数が呼び出されます。
リクエストデータからSQLインジェクションペイロードを含む desired_price の値が、以下の流れでSQLクエリとして実行されます。
SQLインジェクションペイロードを含む desired_price の値が直接クエリ条件句に渡され、変数 $price_query に代入されます。
product_title_textやrangeも直接クエリに渡されますが、PoCではdesired_priceにSQLインジェクションペイロードを渡したため、ここではdesired_priceのみ説明します。
// elex-ajax-apifunctions.php at line 1280
$price_query = " AND meta_key='_regular_price' AND meta_value {$filter_range} {$data_to_filter['desired_price']} ";

その後、変数 $price_query が変数 $sql に追加され(1365行目、#1)、変数 $sql と文字列 AND および変数 $product_type_condition によって変数 が初期化されます(1379行目、#2)。

したがって、SQLインジェクションペイロードを含むリクエストパラメータ desired_price は、$wpdb->prepare( '%1s', $main_query ) 文の $main_query に含まれます。このとき、%1s フォーマット指定子は $main_query の値をそのまま渡すため、SQLインジェクションペイロードがエスケープされずにクエリに挿入され、SQLインジェクションの脆弱性が発生します。
⚠️ PoCコードは、商品管理アカウントを使用してブラインドSQLインジェクションを悪用し、データベース名を取得するように実装されています。

次に、以下のコマンドを入力してPoCコードを実行します。
必要なモジュールrequests
python poc.py

$main_query変数
$sqlはelex-ajax-apifunctions.phpの1257行目で初期化されています。

最後に、変数 $main_query が以下のように prepare 関数の引数として渡され、データベースクエリが実行されます。