Introduction:

السلام عليكم ورحمة الله وبركاته
في أغلب الأوقات إذا كان فيه CVE ID number وكان الهدف الوصول إلى كتابة إستغلال هناك طرق وأساليب مختلفة أحدها هو الطريقة المستخدمة اليوم والفكرة هنا نبدأ من حيث إنتهى فريق المطورين الخاص بالمنتج المصاب. بما معناه نشوف وش كانت طريقة الفريق في عمل patching للثغرة ونبدأ من هناك
في حالتنا اليوم ( CVE-2022–21661 - SQL injection in the Core of Wordpress ) قام فريق المطورين بـ Worddpress بعمل الحل التالي

Investigation:

مثل ماشفنا بالصورة فوق. واضح جدا المشكلة تتعلق بـ

$query['terms'] at line 559

اللي هو موجود في ملف

wp-includes/class-wp-tax-query.php

بعد ماعرفنا المعلومتين هذي قمنا بتنصيب الـ Wordpress locally
وبعدها فتحنا برنامج الـ VS Code بهدف البدء في التحليل ونشوف وش المشكلة المتعلقة بـ

$query['terms'] at line 559

الـ

array $query

تعتبر كمتغير للدالة

function clean_query

اللي بالأساس وظيفتها

Validates a single query

الدالة

clean_query()

فيها شرطين والهدف هنا هو المحافظة على قيمة

$query['terms']

بحيث أن قيمتها تبقى ثابتة وماتتغير
يمكننا بكل بساطة جعل قيمة

$query['taxonomy']

فارغة و

$query['field'] === term_taxonomy_id

وبكذا راح نوصل للسطر رقم

559

ونستمر لحد مانوصل للسطر رقم

579

هذا

$this->transform_query( $query, 'term_taxonomy_id' );

خلونا نشوف إيش وظيفة الدالة

transform_query()

فالبداية راح تتأكد من أن قيمة

$query['terms']

فارغة أم لا ؟ اللي هي بحالتنا راح يكون فيها قيمة. بعد ذلك راح تتأكد من أن قيمة

$query['field'] === $resulting_field at line 601

وهذا الشي موجود مسبقا في الخطوة السابقة بتمرير القيمة

'term_taxonomy_id'

للدالة

transform_query()

الآن بما أننا وصلنا لهذي المرحلة وقدرنا نحافظ على قيمة

$query['terms']

الهدف صار , كيف نوصل لإستغلال لهالشي ؟

Exploitation:

بالرجوع إلى وصف الثغرة في موقع MITRE
راح نشوف أن هذي الثغرة تبدأ من

WP_Query class

وببحث بسيط نشوف أن هذا الكلاس يتواجد بملف

wp-includes/class-wp-query.php

وبكذا بدأنا بقراءة الـ

public function __construct()

ومن هناك نشوف أنه يتم تمرير القيمة إلى دالة

query()

واللي بكل بساطة تسوي

Sets up the WordPress query by parsing query string.

وفالنهاية راح تسوي

return $this->get_posts();

وبكذا لازم نشوف دالة

get_posts()

وش تسوي وإيش فيها بالضبط ؟
بإختصار فالسطر رقم 2138 من الدالة نشوف إننا راح نمرر القيم لدالة get_sql

$clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' );

وبالإستكمال على هذي الطريقة راح نتوصل للطريق الكامل للوصول للمبتغى عن طريق

__construct()> query()> get_posts()> get_sql() at line 2138> get_sql_clauses() at line 250> get_sql_for_query() at line 247> get_sql_for_clause() at line 324> clean_query() at line 394

أخيرا, بعد وضع الكثير من الـ break-points وتتبع كل دالة قام فريقنا بعمل

Wordpress Plugin

فالبداية راح يتم عمل اوبجكت من الكلاس

WP_Query class

وبعدها تمرير كل المتطلبات اللي ناقشناها سابقا. وأخيرا عمل Non-authenticated Ajax actions for logged-out users

<?php
/*
Plugin Name: CVE-2022-21661 Plugin
Description: This plugin was made in order to test ( CVE-2022-21661 )
Version: 1337
Author: Confidential Team
Author's Twitter : @ConfidentialTm
*/

function testinSQLinjection(){
    //Args to be passed to the WP_Query class object
    $args = array(
        'tax_query' => array(
        'Confidential' => array(
        'field' => 'term_taxonomy_id',
        'terms' => array("'"),
        )
    )
);
    //WP_Query class object with specific args 2 trigger the SQLinjection
    $trigger = new WP_Query($args);
    return $trigger;
}
    //Non-authenticated Ajax actions for logged-out users
add_action('wp_ajax_nopriv_Confidential','testinSQLinjection');
?>

تفعيل الـ :Plugin

ولمراقبة كل الخطوات السابقة والتأكد من الوصول للهدف قمنا بعمل Break-Points وبعدها قمنا بإرسال الريكويست النهائي

هنا بالنظر للزاوية اليسار بالأعلى نلاحظ أن القيم كانت بالشكل المطلوب تماما

$query['taxonomy'] is empty and $query['field'] = term_taxonomy_id

أخيرا :

Conclusion:

فالنهاية, هذه الثغرة تعتبر بالكود البرمجي الأساسي لوورد بريس ومع ذلك لايمكن إستغلالها مباشرة. إلا بوجود Plugin or Theme يكون فيها كل البروسيس المذكور سابقا.

Credit:

This issue was documented back 2019 by @Paul_Axe and at the end of 2021 year the GiaoHangTietKiem JSC team has reported it to the Wordpress team and got the CVE for it several days ago jan 6, 2022.

References: