
CVE-2025-22710 の PoC
WordPress プラグイン
コンポーネント名 WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
脆弱性のあるバージョン <= 8.50.0
コンポーネントスラッグ smart-manager-for-wp-e-commerce
コンポーネントリンク https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
脆弱性クラス A3: インジェクション
脆弱性タイプ SQLインジェクション
管理者
WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager(以下 Smart Manager)プラグインは、WordPress のすべての投稿タイプを一括編集および表示できるプラグインです。
Smart Manager プラグイン バージョン 8.50.0 以下では、投稿を表示するための高度な検索機能を使用する際に、フィルタリング値がエスケープ処理なしでデータベースクエリに渡されるため、SQL インジェクションの脆弱性が発生します。
ただし、SQL インジェクション攻撃の直接的な結果は画面に表示されませんが、真/偽条件に基づく応答値の違いにより、Blind SQL インジェクションが可能です。
⚠️ 真/偽条件に基づく応答値の違いを確認するには、少なくとも1つの投稿が存在している必要があります。
/wp-admin/admin.php?page=smart-manager)に移動します。

' OR 1=1 )) # を入力します。その後、上部の検索ボタンをクリックします。

' OR 1=2 )) # を入力すると、条件が常に偽(OR 1=2)であるため、投稿は取得されません。

上記の PoC 説明で要求された「高度な検索」機能を実行すると、次のパケットが生成され、高度な検索で入力されたフィルタリング値(投稿タイトル、が一致する、' OR 1=1 )) #)がリクエストデータ advanced_search_query に入力されます。
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

このパケットがリクエストされると、/wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php ファイル内の get_data_model 関数が呼び出され、次の順序でデータベースクエリを実行します。
リクエストデータ advanced_search_query が存在する場合、process_search_cond 関数を呼び出します。このとき、リクエストデータ advanced_search_query はキーと値のペアの引数のうち、キー search_query の値として渡されます。
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

呼び出された process_search_cond 関数は、キー search_query の値を反復処理し、フィルタリング値「投稿タイトル(post_title)」を変数 $search_col に初期化し、SQL インジェクションペイロードを含むフィルタリング値 ' OR 1=1 )) # を変数 $search_value に初期化します。
高度な検索機能では、ユーザー入力(' OR 1=1 )) #)がエスケープ処理なしでデータベースクエリに直接含まれ、SQL インジェクションの脆弱性が発生します。この脆弱性により、攻撃者は任意の SQL クエリを実行でき、データベースからの機密情報の漏洩や改ざんなど、重大なセキュリティリスクにつながる可能性があります。
⚠️ PoC コードの実装では、SQL インジェクションの脆弱性を悪用してデータベース名を問い合わせます。
PoC コードをエディタで開き、WordPress サイトのアドレスと管理者の認証情報を入力します。

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


変数 $search_col と $search_value は、それぞれ $search_params 配列のキー search_col(=post_title)と search_value(=' OR 1=1 )) #)に渡されます。その後、この $search_params 変数はキー search_params の値として create_flat_table_search_query 関数に渡されます。

次に、create_flat_table_search_query 関数は SQL クエリの WHERE 句を定義しますが、この時点で、引数として渡されたキー search_params の search_value(=' OR 1=1 )) #)はエスケープ処理なしで WHERE 句に含まれます。

その後、create_flat_table_search_query 関数の戻り値(SQL インジェクションペイロードを含む)が process_flat_table_search_query 関数に引数として渡されます。

process_flat_table_search_query 関数は、受け取った引数を使用してデータベースクエリを構築し、変数 $select、$from、$where を初期化します。ここで、SQL インジェクションペイロードが検証なしで変数 $where に直接渡されていることがわかります。

変数 $select、$from、$where は直接変数 $query_posts_search に代入され、この変数は最終的にデータベースクエリを実行する関数に引数として渡されます。
