
إضافة WordPress PPOM for WooCommerce <= 33.0.15 معرّضة لثغرة حقن SQL (SQL Injection)
يحتوي هذا المستودع على إثبات مفهوم (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 # The Python Proof of Concept script.
└── woocommerce-product-addon/ # Vulnerable version of the plugin (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 ) );
إثبات المفهوم هذا مخصص للأغراض التعليمية والبحثية فقط. لا تستخدمه على أي نظام لا تملكه أو ليس لديك إذن صريح لاختباره. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذا السكربت.