このリポジトリには、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コマンドを実行でき、脆弱性を確認したり、データベースから機密情報を1文字ずつ外部に持ち出したりすることが可能になります。
この脆弱性は、プラグイン設定で**「Enable Legacy Price Calculations」**オプションが有効な場合に発動します。この設定により、カート操作中にアプリケーションが脆弱なコードパスを使用するようになるためです。
└── cve-2025-11391/
├── exploit.py # PythonのProof of Conceptスクリプト。
└── woocommerce-product-addon/ # 脆弱性のあるバージョンのプラグイン(v33.0.15)。
requests ライブラリがインストールされたPython 3.x(pip install requests)。/htdocs/wp4hacking/)にWordPressをインストールします。woocommerce-product-addon/ ディレクトリから .zip ファイルをアップロードして、このリポジトリに含まれる脆弱性のあるバージョンの woocommerce-product-addon(v33.0.15)をインストールします。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は、教育および研究目的のみを意図しています。所有していない、またはテストする明示的な許可がないシステムでは使用しないでください。著者は、このスクリプトの誤用またはそれによって引き起こされた損害について一切の責任を負いません。