Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2024-57521-RuoYi-SQLi — تدقيق ثابت للشيفرة البرمجية للثغرة CVE-2024-57521، وهي حقن SQL بعد المصادقة في وحدة المولّد في RuoYi-Vue، مع تحليل من المصدر إلى النقطة الحرجة وإثبات مفهوم لتجاوز المرشّح %0b. | Kitploit
أدوات/GitHubGitHub/xs2024770/cve-2024-57521-ruoyi-sqli
تحليل الشفرة الثابت (SAST)تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويبالأوراق والأبحاثالتعلم والتعليم
GitHubxs2024770/cve-2024-57521-ruoyi-sqli

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2024-57521-RuoYi-SQLi

تدقيق ثابت للشيفرة البرمجية للثغرة CVE-2024-57521، وهي حقن SQL بعد المصادقة في وحدة المولّد في RuoYi-Vue، مع تحليل من المصدر إلى النقطة الحرجة وإثبات مفهوم لتجاوز المرشّح %0b.

عرض المستودع
48منذ شهر واحدلم تتم المراجعة بعد

🛡️ ملاحظات تدقيق ثغرة حقن SQL بعد المصادقة CVE-2024-57521 في RuoYi-Vue

CVE

الشكل 1: مخطط تدقيق تدفق بيانات ثغرة حقن SQL CVE-2024-57521

0. إعلان المشروع

هذا المستودع مخصص لأغراض البحث الأمني والتعليم فقط. يُرجى عدم استخدام التقنيات الواردة في هذا المستند لتنفيذ هجمات غير مصرح بها. تم إجراء جميع الاختبارات في بيئة تدقيق شيفرة ثابتة محلية.


1. نظرة عامة على الثغرة

  • رقم CVE: CVE-2024-57521
  • المكوّن المتأثر: نظام إدارة الصلاحيات RuoYi-Vue (وحدة ruoyi-generator)
  • الإصدارات المتأثرة: <= v4.7.9
  • نوع الثغرة: حقن SQL بعد المصادقة (حقن أعمى منطقي / CWE-89)
  • تقييم CVSS: 10.0 (حرج)
  • طريقة التدقيق: تدقيق شيفرة ثابتة بحت (تحليل الشيفرة المصدرية)

2. تحليل تدقيق تدفق البيانات (Source → Filter → Sink)

2.1 Source (نقطة إدخال المستخدم)

  • موقع الملف: ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java

الشيفرة الرئيسية:

@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
    try
    {
        SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器

التحليل: يمكن لمسؤول الخلفية تمرير أي عبارة إنشاء جدول لقاعدة البيانات عبر معامل sql في طلب HTTP POST. نقطة الدخول لا تفرض قيودًا كافية على إدخال المستخدم، بل تُمرّره مباشرة إلى الفلتر اللاحق.

دليل لقطة الشاشة: 03-SqlUtil-filterKeyword

2.2 Filter (عيب قاتل في الفلتر)

· موقع الملف: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java

كود العيب الجوهري:

// 第16行:黑名单定义,注意关键词带有【尾随空格】
public static String SQL_REGEX = "\u0008|%0A|and |extractvalue|updatexml|sleep|information_schema|exec...";

// 第61-66行:过滤逻辑
String normalizedValue = value.replaceAll("\\p{Z}|\\s", ""); // 先清空了输入里的所有空格
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
    if (StringUtils.indexOfIgnoreCase(normalizedValue, sqlKeyword) > -1)
    {
        throw new UtilException("请求参数包含敏感关键词" + sqlKeyword + ",可能存在安全风险");
    }
}

تحليل الثغرة: ينفّذ الفلتر أولاً replaceAll("\\p{Z}|\\s", "") لحذف جميع أحرف المسافات البيضاء من المدخل. غير أن الكلمات المفتاحية في القائمة السوداء SQL_REGEX (مثل "and " و"select ") تتضمن مسافة لاحقة. وهذا يجعل المطابقة تفشل حتماً، إذ يكفي أن يستخدم المهاجم %0b (علامة التبويب العمودية) بدلاً من المسافة بعد الكلمة المفتاحية ليتجاوز فحص القائمة السوداء تماماً.

أدلة لقطات الشاشة:

02-SqlUtil-SQL_REGEX 01-GenController-createTableSave

2.3 Sink (نقطة الخطر)

· موقع الملف: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml

الكود الأساسي:

<update id="createTable">
    ${sql}
</update>

تحليل: في MyBatis، يقوم ${} بدمج السلاسل النصية مباشرةً، بدلاً من استخدام الاستعلام المُعد الآمن #{}. مما يؤدي إلى إرسال SQL خبيث تجاوز الفلاتر إلى قاعدة البيانات لتنفيذه. هذه ثغرة نموذجية من نوع "تصفية بالقائمة السوداء + دمج غير آمن".

أدلة لقطة الشاشة:

04-GenTableMapper-createTable

3. منطق PoC وأفكار الاستغلال

3.1 أسلوب التجاوز

· الطريقة: يستخدم المهاجم %0b (حرف الجدولة العمودية في MySQL، والذي يقع ضمن نطاق مطابقة \s) بدلاً من المسافات في جملة SQL.

3.2 تحليل سلسلة التنفيذ الكاملة

  1. HTTP 传入带有 %0b 的 Payload:CREATE table xxx as SELECT%0b111 FROM sys_job WHERE 1=0 AND%0bIF(<条件>, 1, 1/0);
  2. Payload 进入 filterKeyword 方法,%0b 被 \s 匹配并清空,字符串变为 select111 和 andIF。
  3. 由于黑名单是 "select "(带空格),"select111".indexOf("select ") 返回 -1,成功绕过黑名单拦截。
  4. 危险参数进入 MyBatis,${sql} 将其拼接到数据库。
  5. MySQL 解析时,%0b 被视为合法的空白字符,SQL 成功注入执行。

3.3 فكرة أتمتة الحقن الأعمى

· مبدأ الاستكشاف: استخدام IF(<الشرط>, 1, 1/0) كأداة كشف للحقن الأعمى المنطقي. · إذا كان الشرط خاطئاً: يتم إطلاق خطأ القسمة على صفر، ويعيد الخادم HTTP 500. · إذا كان الشرط صحيحاً: لا يحدث خطأ ويعود الوضع طبيعياً. · طريقة الاستخراج: يمكن استخدام طريقة التنصيف لتخمين بيانات قاعدة البيانات بتاً بتاً.


4. الخلاصة وتوصيات الإصلاح

4.1 ملخص أسباب الثغرة

هذه الثغرة هي تجاوز نموذجي ناتج عن "إصلاح غير كامل". أدخل المطورون آلية القائمة السوداء عند إصلاح حقن SQL مماثل سابقاً، لكنهم أغفلوا أن القائمة السوداء تعتمد على المسافات، وأن المنطق المسبق لإزالة المسافات يُفسد شروط مطابقة القائمة السوداء، مما أدى في النهاية إلى تجاوز جديد (CVE-2024-57521).

4.2 توصيات الإصلاح

· إلغاء آلية القائمة السوداء: لا تعتمد على القائمة السوداء، فآلية القائمة البيضاء هي الأساس الآمن. · استخدام الاستعلام المُعد: غيّر ${sql} في MyBatis إلى أسلوب الاستعلام المُعد #{}. إذا كان لا بد من تمرير SQL ديناميكياً (مثل إنشاء الجداول أو Order By)، فيجب استخدام تحليل صارم لشجرة التركيب المجردة (AST) أو تحقق صارم من المعاملات. · تحسين الفلتر: إذا كان لا بد من استخدام القائمة السوداء، فيجب إزالة المسافات اللاحقة من كلمات القائمة السوداء المفتاحية، وإجراء توحيد قياسي قبل المقارنة (مثل التحويل الموحد إلى أحرف صغيرة، واستبدال %0b وغيرها بمسافات).


5. روابط مرجعية

· NVD - CVE-2024-57521 · مستودع RuoYi-Vue على Gitee

6. سكربت PoC آلي (بناءً على الحقن عبر الأخطاء)

  • موقع الملف: poc/poc_boolean.py (ملاحظة: يُقترح لاحقاً تغيير اسم الملف إلى poc_error_based.py ليتوافق مع المنطق الفعلي)
  • مبدأ التنفيذ: استخدام الدالة extractvalue() لإطلاق خطأ XPath، واستخراج البيانات عبر مطابقة النمط XPATH syntax error: '~...~' بتعبير نمطي. يُستخدم /**/ في الـ Payload بدلاً من المسافات لتجاوز تصفية القائمة السوداء.
  • الـ Payload الأساسي:

CREATE//table//{随机表名}//as//SELECT/**/extractvalue(1,concat(0x7e,({查询语句}),0x7e))

ملاحظات الاختبار: في بيئة اختبار RuoYi المُعدّة محليًا، تم التحقق بنجاح من إمكانية تجاوز WAF باستخدام %0b ومن جدوى حقن الأخطاء عبر extractvalue، وقد استخرج السكربت بثبات إصدار MySQL (5.7.26)، واسم قاعدة البيانات الحالية (ry)، ومستخدم اتصال قاعدة البيانات (root@localhost).

屏幕截图 2026-09-29 172250
تنزيل الأداة