
WordPress PPOM for WooCommerce Plugin <= 33.0.15 は SQLインジェクションに対して脆弱です。
このリポジトリには、WordPressプラグイン「PPOM for WooCommerce」のバージョン 33.0.15 までに影響する、未認証の時間ベースのブラインドSQLインジェクション脆弱性の Proof of Concept(PoC)が含まれています。
この脆弱性は、プラグインがSQLクエリで使用する前にユーザー入力を適切にサニタイズしていないために存在します。具体的には、classes/plugin.class.php 内の get_product_meta() 関数が、プリペアドステートメントを使用せずに $meta_id パラメータをSQLクエリに直接連結しています。
脆弱なコード(classes/plugin.class.php):
function get_product_meta( $meta_id ) {
// ...
global $wpdb;
$qry = 'SELECT * FROM ' . $wpdb->prefix . PPOM_TABLE_META . " WHERE productmeta_id = $meta_id";
$res = $wpdb->get_row( $qry );
return $res;
}
認証されていない攻撃者は、悪意のあるペイロードを作成し、商品をカートに追加する際に ppom[fields][id] パラメータに注入することで、これを悪用できます。これにより、攻撃者は時間遅延関数(SLEEP())などの任意のSQLコマンドを実行でき、脆弱性を確認したり、データベースから機密情報を文字ごとに外部に持ち出す可能性があります。
この脆弱性は、プラグインの設定で "レガシー価格計算を有効にする" オプションが有効な場合に発動します。これにより、カート操作中にアプリケーションが脆弱なコードパスを使用するようになるためです。
└── cve-2025-11391/
├── exploit.py # The Python Proof of Concept script.
└── woocommerce-product-addon/ # Vulnerable version of the plugin (v33.0.15).
requestsライブラリ(pip install requests)。/htdocs/wp4hacking/)にWordPressをインストールします。woocommerce-product-addon(v33.0.15)を、woocommerce-product-addon/ ディレクトリから .zip ファイルをアップロードしてインストールします。sql_injection)を付けます。提供されている exploit.py スクリプトは、SLEEP() コマンドを注入してサーバーの応答時間を測定することで、脆弱性を確認します。
exploit.py ファイルを開き、以下の変数を設定します:
PRODUCT_URL: 作成した脆弱な商品ページの完全なURL。add_to_cart_data['add-to-cart']: 脆弱な商品のID。ターミナルからスクリプトを実行します:
python exploit.py
ターゲットが脆弱な場合、サーバーが SLEEP() の時間よりも長く応答に時間がかかり、スクリプトがタイムアウトします。スクリプトはこのタイムアウトを正常な悪用として正しく解釈します。
Attempting SQL Injection PoC (One-Step Method)...
Make sure 'Enable Legacy Price Calculations' is active.
[*] Sending SQL Injection payload...
Request timed out after 10.00 seconds.
[+] SUCCESS! 'Read timed out' occurred because the SLEEP(7) payload was executed.
The site is vulnerable to Time-Based Blind SQL Injection.
$wpdb->prepare() を使用して入力を適切にサニタイズし、SQLインジェクションを防ぎます。パッチ適用済みコード(classes/plugin.class.php):
$table = $wpdb->prefix . PPOM_TABLE_META;
$res = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE productmeta_id = %d", $meta_id ) );
このPoCは教育および研究目的のみを意図しています。所有していないシステムや、テストする明示的な許可がないシステムでは使用しないでください。作者は、このスクリプトによって引き起こされる誤用や損害について一切の責任を負いません。