
تحليل فني واستغلال إثبات المفهوم لـ CVE-2021-43408، وهو ثغرة حقن SQL في إضافة WordPress Duplicate Post الإصدار 1.1.9، مع دليل استغلال خطوة بخطوة ونصائح الإصلاح.
WordPress هو برنامج CMS (نظام إدارة المحتوى) مفتوح المصدر، وهو نظام لإدارة المحتوى. بدلاً من استخدام لغة HTML البرمجية، كُتب ووردبريس بلغة البرمجة PHP باستخدام قاعدة بيانات MySQL. أسس ووردبريس المبرمج Matt Mullenweg وMike Little. حالياً، ووردبريس مملوك لشركة Automattic ومقرها في سان فرانسيسكو، كاليفورنيا بالولايات المتحدة الأمريكية.
إضافة Duplicate Post في ووردبريس للإصدارات 1.1.9 فما دون تعاني من ثغرة حقن SQL. هذا النوع من الاستغلال يسمح للمهاجم بحقن استعلامات SQL وبالتالي قراءة أو تعديل أو حتى حذف الموارد في قاعدة البيانات.
يمكن استغلال هذه الثغرة من قبل أي مستخدم مصادق لديه صلاحية استخدام وظيفة إضافة Duplicate Post. افتراضياً، يمتلك المدير (Admin) هذه الصلاحية فقط، ومع ذلك يمكن تعديل الصلاحيات بحيث يتمكن المحرر (Editor) والكاتب (Author) والمساهم (Contributor) وحتى المشترك (Subscriber) من استخدام هذه الإضافة.
تم اكتشاف CVE-2021-43408 في "11/19/2021" وتم تقييمها بمستوى HIGH وفق مقياس CVSS.

السبب الجذري لهذه الثغرة هو أن البيانات المرسلة من طلب المستخدم لا يتم تعقيمها قبل تنفيذها في استعلام SQL.
بشكل أكثر تحديداً، في الملف post/handler.php، داخل الدالة cdn_insert_post()
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// Get Wordpress database
global $wpdb;
// Create empty array for new id(s) and error(s)
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// Get Counter value
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
المتغير
$idيتم التحكم فيه من قبل المهاجم
يتم تمرير المتغير $id إلى دالة تحتوي على استعلام SQL دون أي تعقيم. يتم استدعاء هذه الدالة عبر Ajax الخاص بووردبريس wp_ajax_cdp_action_handling.
يمكن ملاحظة أن المعامل id يُمرَّر عبر الدالة cdn_sanitize_array، حيث تمر حقول بيانات المقالة عبر الدالة sanitize_text_field، التي تقوم بإفلات (escape) أي علامة اقتباس ' في سلسلة البيانات.

يتم تطبيق
sanitize_text_fieldعلى حقول البيانات
لكن الكود يحتوي على ثغرة عند تمرير بيانات الحقل الصحيح (Integer) إلى استعلام SQL المنفذ (حقل id)، حيث يمكن للمهاجم استغلال ذلك لإدراج عبارات SQL إضافية في قيمة هذا الحقل. لذلك، للتحكم في استعلام SQL، يحتاج المهاجم فقط إلى تجنب استخدام الرمز '.
الخطوة 1: سجّل الدخول إلى مستخدم Admin، وقم بتثبيت إضافة Duplicate Post الإصدار 1.1.9. تدعم هذه الإضافة المستخدمين في استنساخ المقالات الموجودة.

الخطوة 2: انتقل إلى قسم Post، اختر مقالة واحدة، واختر الإجراء Copy ثم اضغط Apply.

الخطوة 3: اختر Setting: Default واضغط Copy.

الخطوة 4: اعترض طلب HTTP؛ الحقل المهم هنا هو id، ويمكن ملاحظة أن بيانات هذا الحقل تكون من نوع رقم صحيح (Integer).

الخطوة 5: قم بحقن حمولة (payload) حقن SQL، ثم أرسل الطلب ولاحظ أن الخادم يستجيب بعد 9 ثوانٍ -> نجاح حقن SQL. الحمولة: 1 and (select*from(select(sleep(9)))a)--

