
دروبال 11.4.8 - عالية - عن بُعد - XSS - لا يزال AttributeXss يسمح بسمات HTMX
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
المقال التقني: https://abraxaslabs.tech/research/drupal-htmx-attr
الفئة: XSS مخزّن الوصول: عن بُعد
نواة Drupal 11.4.8 (61044508) - Drupal
أغلقت SA-CORE-2026-011 سمات HTMX في Xss::attributes(). تمرّ سمات الروابط والقوائم عبر AttributeXss::sanitizeAttributes، ولا تزال قائمة التجاوز تلك تُسقط style وon* فقط.
محرّر محتوى يستطيع تعيين حقل Link (أو رابط قائمة) يمكنه تخزين hx-on-click أو data-hx-on-click. يُحمّل Standard مع BigPipe الوحدة core/htmx. وعندما يفتح مسؤول أو أي مشاهد آخر تلك العقدة وينقر على الرابط، تُشغّل HTMX جافاسكربت المخزّن في أصل الموقع.
| المعرّف | لا يوجد CVE بعد |
| الفئة | XSS مخزّن (سمات أحداث HTMX) |
| الوصول | عن بُعد (كاتب حقل Link / قائمة موثّق؛ الضحية يشاهد وينقر) |
| CWE | CWE-79 |
| CVSS | مرتفع: 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| المنتج | نواة Drupal |
| المتأثر | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| المصادقة | مستخدم موثّق يستطيع كتابة حقل Link (أو رابط قائمة). الضحية يشاهد الصفحة وينقر. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
الكاتب: محرّر محتوى يستطيع تعيين options.attributes للرابط (حقل Link، رابط قائمة، JSON:API). الضحية: أي شخص تُحمّل صفحته HTMX (يُحمّل Standard مع BigPipe الوحدة core/htmx)، بما في ذلك مسؤول الموقع الذي ينقر على الرابط.
| الصلاحية | الطريقة / المسار | النوع | مُثبت مختبريًا أم مُستنتج |
|---|---|---|---|
| تخزين سمات أحداث HTMX على رابط | POST /jsonapi/node/article مع field_link.options.attributes.hx-on-click وdata-hx-on-click | سلامة الحقل المخزّن | مُثبت مختبريًا. JSON:API 201، والسمات المخزّنة لا تزال تحتوي hx-on-click |
طباعة تلك السمات على <a> الخاص بالعقدة | LinkFormatter -> AttributeXss::sanitizeAttributes | سلامة HTML | مُثبت مختبريًا. HTML الخاص بـ GET /node/1 يحتوي hx-on-click والعلامة window['DRUPAL-HTMX-ATTR-WITNESS']=1 |
| تشغيل ذلك الجافاسكربت في أصل الضحية عند النقر | تربط HTMX hx-on-* | سلامة جلسة الضحية | مُستنتج من HTMX + تحميل الصفحة لـ core/htmx. لم يُجرِ المختبر نقرة متصفح فعلية |
| التصرف بصفة المشاهد (كوكي الجلسة، نقرات واجهة المسؤول) | نفس XSS المخزّن | سلامة جلسة الضحية | مُستنتج. يتوقف المختبر عند بقاء السمة في HTML |
سلبي: Xss::filter | Xss::filter('<a ... hx-on-click=...>') | مغلق | مُثبت مختبريًا أنه مغلق. xss_keeps_hx=False |
| كتابة الرابط دون مصادقة | JSON:API دون جلسة | مغلق | سجّل المختبر الدخول باسم uid 1 أولًا. لا يستطيع غريب بلا حساب تعيين الحقل |
| RCE عبر PHP / LPE | لا ينطبق | مغلق | هذا المتبقي جافاسكربت متصفح، وليس PHP على الخادم |
متبقٍ من نفس التثبيت: Move Block sibling markup.
ثبّتُ drupal/drupal 11.4.8 بعد SA-CORE-2026-011. خمس عمليات بحث: XSS/HTMX، وملفات/MIME/oEmbed، وJSON:API/unserialize/SQLi، والمصادقة/CSRF/Host، وREST/media/Views. تبقى معالجات وصول JSON:API، ومفاتيح IN في EntityQuery (SA-004)، وPOI للحقول المتسلسلة (SA-005)، وHost في rebuild.php (SA-007) مُرقَّعة. وقد وصلت قائمة تخطي HTMX إلى Xss.php فقط.
$skip = (
in_array($attribute_name, ['style', 'srcdoc']) ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, 'data-hx') ||
str_starts_with($attribute_name, 'hx') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
AttributeXss.php المتبقي:
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
يشمل المستدعين LinkFormatter.php وMenuLinkContent::getUrlObject().
المنعطفات الخاطئة المسجّلة مسبقًا: التعامل مع Xss::filter على أنه المتبقي (فهو الضابط)؛ كتابة JSON:API غير الموثّقة؛ PHP RCE؛ صدفة عكسية. مسرح. المرجع هو السمة المتبقية على HTML العقدة بالإضافة إلى core/htmx المحمّل.
python3 drupal-htmx-attr-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19480. نسخة حيّة drupal:11.4.8-apache، ملف تعريف Standard، كتابة JSON:API مُفعّلة للمختبر. مشروع Compose drupal-htmx-attr.
SUCCESS drupal-htmx-attr how=live write=jsonapi nid=1 hx-on-click=kept jsonapi-stored=1 xss-filter=stripped htmx=loaded marker=1 version=11.4.8 DRUPAL-HTMX-ATTR-WITNESS
انسخ قائمة الحظر hx / data-hx / srcdoc إلى AttributeXss. وادمجها في Xss كما يذكر تعليق توثيق الفئة بالفعل.
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.