
WordPress PPOM for WooCommerce Plugin <= 33.0.15 عرضة لحقن SQL
يحتوي هذا المستودع على إثبات مفهوم (PoC) لثغرة حقن SQL أعمى قائمة على الوقت وغير مصادق عليها في إضافة "PPOM for WooCommerce" الخاصة بووردبريس، والتي تؤثر على الإصدارات حتى 33.0.15 وما يعادلها.
توجد الثغرة لأن الإضافة تفشل في تعقيم المدخلات المقدمة من المستخدم بشكل صحيح قبل استخدامها في استعلام SQL. على وجه التحديد، تقوم الدالة get_product_meta() في ملف classes/plugin.class.php بدمج المعامل $meta_id مباشرة في استعلام SQL دون استخدام عبارات مُجهزة (prepared statements).
الكود القابل للاستغلال (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] عند إضافة منتج إلى سلة التسوق. وهذا يسمح للمهاجم بتنفيذ أوامر SQL عشوائية، مثل دوال التأخير الزمني (SLEEP())، مما يمكنه من تأكيد وجود الثغرة وربما استخراج معلومات حساسة من قاعدة البيانات حرفًا بحرف.
يتم تفعيل الثغرة عندما يكون خيار "Enable Legacy Price Calculations" (تفعيل حسابات الأسعار القديمة) نشطًا في إعدادات الإضافة، حيث يفرض ذلك على التطبيق استخدام مسار الكود القابل للاستغلال أثناء عمليات سلة التسوق.
└── cve-2025-11391/
├── exploit.py # سكربت إثبات المفهوم بلغة بايثون.
└── woocommerce-product-addon/ # الإصدار القابل للاستغلال من الإضافة (v33.0.15).
requests (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15) المقدم في هذا المستودع عن طريق رفع ملف .zip من مجلد woocommerce-product-addon/.sql_injection).يؤكد سكربت exploit.py المقدم وجود الثغرة عن طريق حقن أمر SLEEP() وقياس زمن استجابة الخادم.
افتح ملف exploit.py وقم بتكوين المتغيرات التالية:
PRODUCT_URL: الرابط الكامل لصفحة المنتج القابل للاستغلال الذي أنشأته.add_to_cart_data['add-to-cart']: معرف منتجك القابل للاستغلال.شغّل السكربت من الطرفية:
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 ) );
إثبات المفهوم هذا مخصص لأغراض تعليمية وبحثية فقط. لا تستخدمه على أي نظام لا تملكه أو ليس لديك إذن صريح لاختباره. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذا السكربت.