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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-68116 — توثيق CVE-2025-68116 | Kitploit
أدوات/GitHubGitHub/x0root/cve-2025-68116
تحليل الثغرات الأمنيةالاستغلالأمن الويباختبار الاختراقالأوراق والأبحاثالتعلم والتعليم
GitHubx0root/cve-2025-68116

CVE-2025-68116

توثيق CVE-2025-68116

عرض المستودع
منذ 8 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة

CVE-2025-68116

المؤلف: @x0root
الثغرة: تخزين Cross-Site Scripting (XSS) عبر التحميلات القابلة للعرض في المتصفح (SVG / HTML)
البرنامج المتأثر: FileRise (< 2.7.1)
الإصدار المصحح: 2.7.1
CVE الرسمي (تم طلبه عبر GHSA): CVE-2025-68116 (التتبع/النشرة: GHSA-35pp-ggh6-c59c)
النشرة ذات الصلة السابقة (التخفيف الأصلي الذي تم تجاوزه): GHSA-qrcv-vjvf-fr29


تقييم CVSS:

  • CNA (GitHub): CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:L — 8.9 (عالي)
  • المُبلِّغ (تحليل المؤلف): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L — 9.6 (حرج)

الأساس المنطقي لتسجيل CVSS (المُبلِّغ)

يقوم تقييم المُبلِّغ بتقييم الامتيازات المطلوبة (PR) عند نقطة الاستغلال، وليس عند نقطة زرع الثغرة.

يحدث الاستغلال عندما يصل الضحية إلى رابط مشاركة عام تم إنشاؤه، وهو ما لا يتطلب أي مصادقة أو امتيازات (PR:N).

يقوم تقييم CNA بتقييم الامتيازات المطلوبة بناءً على القدرة على تحميل ملف ضار. ومع ذلك، يعرّف CVSS v3.1 الامتيازات المطلوبة (PR) على أنها الامتيازات التي يجب أن يمتلكها المهاجم في وقت استغلال الثغرة، وليس الامتيازات المطلوبة لوضع أو تحضير الحالة الضعيفة.

وبالتالي، فإن PR:N تعكس بشكل أكثر دقة شروط الاستغلال في العالم الحقيقي، مما يؤدي إلى تصنيف شدته كحرجة (9.6).

ملاحظة: قدم النشرة GHSA-qrcv-vjvf-fr29 تخفيفًا منع عرض ملفات SVG داخل واجهة مستخدم FileRise (لوحة المعاينة). هذا التقرير يوثق تجاوزًا لهذا التخفيف—وبالتحديد نقاط نهاية التحميل/المشاركة في الخلفية—التي يتم تتبعها كـ GHSA-35pp-ggh6-c59c / CVE-2025-68116.


ملخص

هذه الوثيقة هي سجل تقني كامل لـ CVE-2025-68116: تخزين XSS في FileRise استمر بعد تخفيف سابق وتم إصلاحه في النهاية في الإصدار v2.7.1. تتضمن الاكتشاف، وإثباتات المفهوم للاستغلال، والإصلاحات الفاشلة المتكررة، وتحليل دقيق للتحكم في التدفق الجذري للسبب (مع الأدلة)، والتحقق النهائي من التصحيح، وتحليل خصائص قابلية الاستغلال ذات الصلة بتقييم CVSS. يعتمد كل المحتوى أدناه على اختبارات معاد إنتاجها، وفحص المتحكم، وسلسلة النشرات العامة.


1. الخلفية: النشرة السابقة والإصلاح غير الكامل

قامت نشرة سابقة، GHSA-qrcv-vjvf-fr29، بمعالجة تخزين XSS عبر تحميلات SVG عن طريق منع العرض المضمن في واجهة مستخدم FileRise. لم يعالج هذا التخفيف كيفية تقديم ملفات SVG بواسطة نقاط نهاية الخلفية مثل:

  • /api/file/download.php
  • /api/file/share.php

توثق CVE-2025-68116 (المتتبعة كـ GHSA-35pp-ggh6-c59c) تجاوزًا لتخفيف GHSA-qrcv-vjvf-fr29: يمكن للمهاجم تخزين SVG مصمم وتوصيله للضحايا عبر روابط مشاركة عامة أو سلوكيات تنزيل معينة، مما يؤدي إلى تنفيذ البرامج النصية في أصل FileRise.


2. الاكتشاف: تحميل إثبات المفهوم والتجاوز

للتحقق مما إذا كانت الخلفية لا تزال تعرض ملفات SVG بطريقة قابلة للعرض، قمت بتحميل SVG بسيط كإثبات مفهوم:

الوصول إلى الملف عبر:

  • /api/file/download.php?…
    والأهم من ذلك، عبر:
  • /api/file/share.php?token=…

أدى إلى تنفيذ alert(). تم تجاوز تخفيف GHSA-qrcv-vjvf-fr29 الأصلي (منع عرض واجهة المستخدم) عن طريق الوصول المباشر إلى نقاط النهاية هذه.


3. إثبات التأثير في العالم الحقيقي

alert() هو إثبات مفهوم؛ اختبرت التأثير الهادف عن طريق جعل الحمولة تتفاعل مع واجهات برمجة التطبيقات الداخلية.

الحمولة المستخدمة في الاختبار:

root@kitploit:~
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <script type="text/javascript">
    fetch('/api/upload/upload.php')
      .then(response => response.text())
      .then(data => alert('API Response: ' + data));
  </script>
</svg>

عندما فتح مسؤول مسجل الدخول رابط مشاركة يحتوي على SVG هذا، تم تنفيذ البرنامج النصي وإجراء طلبات API موثقة. تضمنت التأثيرات الملاحظة:

  • إرجاع استجابات API للبرنامج النصي (يمكن كشف معلومات حساسة)
  • أشارت استجابة API إلى حالة رمز CSRF (مثل {"csrf_expired":true,"csrf_token":"..."})
  • أدى التفاعل إلى إبطال رمز CSRF الحالي للمسؤول، مما منع المزيد من الإجراءات التي تغير الحالة حتى الاسترداد (رفض الخدمة العملي ضد وظائف المسؤول)

تصنيف التأثير الموضح أثناء الاختبار:

  • السرية: عالية (C:H)
  • التكامل: عالي (I:H)
  • التوفر: منخفض (A:L)

4. الجدول الزمني للإفصاح ومحاولات الإصلاح المتكررة

أبلغت عن المشكلة بشكل خاص. أصدر المسؤول عدة إصلاحات تدريجية:

  • v2.6.0 — تم تطبيق التخفيف على نقطة نهاية التنزيل؛ نقطة نهاية المشاركة لا تزال ضعيفة.
  • v2.6.2 — محاولات إضافية؛ ظلت نقطة نهاية المشاركة ضعيفة في اختباراتي.
  • v2.7.0 — زعم تعزيز نقطة نهاية المشاركة؛ لا تزال قابلة للاستغلال في بيئتي.
  • v2.7.1 — الإصلاح النهائي الذي تحققت من حله للمشكلة (انظر قسم التحقق).

طوال الإصدارات v2.6.0 → v2.7.0، استمرت نقطة نهاية رابط المشاركة في تقديم SVG بطريقة سمحت بالعرض المضمن وتنفيذ البرامج النصية. يشرح تحليل السبب الجذري أدناه سبب فشل الإصلاحات السابقة في إغلاق المتجه بالكامل.


5. تحليل السبب الجذري — التحكم في التدفق وفشل الرأس (الأدلة)

لم يكن السبب الأساسي هو رأس مفقود واحد ولكن ترتيب التحكم في التدفق والإخراج داخل shareFile() (المتحكم) الذي منع تطبيق رؤوس الأمان في العديد من مسارات التنفيذ. كان هناك فئتان من المشاكل:

  • نقاط exit; مبكرة متعددة أدت إلى تقصير الدالة قبل تعيين رؤوس الأمان.
  • تحذيرات/إشعارات PHP التي أصدرت مخرجات قبل استدعاءات الرأس، مما تسبب في أخطاء "headers already sent".

5.1 تعداد الخروج المبكر

استخدمت فحص awk لسرد تكرارات header() و exit; داخل shareFile() حتى استدعاء readfile():

الأمر: awk '/function shareFile(/ {flag=1} /readfile(/ {flag=0} flag && /(header|exit;)/ {printf "%4d | %s\n", NR, $0}' src/controllers/FileController.php

المخرجات الملاحظة (مختصرة من تشغيلي):

1649 | header('Content-Type: application/json; charset=utf-8'); 1651 | exit; 1657 | header('Content-Type: application/json; charset=utf-8'); 1659 | exit; 1664 | header('Content-Type: application/json; charset=utf-8'); 1666 | exit; 1670 | header("Content-Type: text/html; charset=utf-8"); 1693 | exit; 1699 | header('Content-Type: application/json; charset=utf-8'); 1701 | exit; 1719 | header('Content-Type: application/json; charset=utf-8'); 1721 | exit; 1725 | header('Content-Type: application/json; charset=utf-8'); 1727 | exit;

تبدأ رؤوس الأمان (منطق التعزيز) في السطر ~1743:

1743 | header('X-Content-Type-Options: nosniff'); ... 1770 | header("Content-Disposition: attachment; ...");

نظرًا لأن الدالة تصدر رؤوسًا + exit; في وقت سابق في العديد من المسارات، لم تصل تلك الطلبات أبدًا إلى كود التعزيز الذي يحدد Content-Disposition أو nosniff أو النوع التقييدي.

5.2 مسار طلب كلمة المرور

في تدفق المشاركة المحمية بكلمة مرور، أصدرت الدالة HTML لمطالبة كلمة المرور مبكرًا:

if (!empty($record['password']) && empty($providedPass)) { header("Content-Type: text/html; charset=utf-8"); ... exit; }

يرسل هذا المسار Content-Type: text/html ويخرج قبل منطق تعزيز SVG، مما يتسبب في العرض المضمن في المتصفحات للمشاركات المحمية بكلمة مرور حيث لم يتم توفير كلمة مرور.

5.3 المشاركات غير المحمية بكلمة مرور (موضحة)

لم تقتصر الثغرة على التدفقات المحمية بكلمة مرور. طلب مشاركة غير محمية بكلمة مرور أرجع text/html أيضًا في اختباراتي:

الأمر: curl -svI "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" 2>&1 | grep -iE "content-type"

الملاحظ: < Content-Type: text/html; charset=UTF-8

هذا يؤكد أنه حتى في الحالة العامة (غير المحمية بكلمة مرور) كانت الاستجابة text/html، وعُرض SVG بشكل مضمن.

5.4 "رؤوس أرسلت بالفعل" بسبب إشعارات PHP

التقطت جلبًا خامًا لنقطة نهاية المشاركة تضمن تحذيرات PHP صدرت قبل تعزيز الرأس. لقطة (مختصرة):

الأمر: curl -s "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" | head -n 30

المخرجات الخام الملاحظة (مختصرة):

Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1644


Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1645

Warning: Cannot modify header information - headers already sent by (output started at /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php:1644) in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1743

...ثم تم بث حمولة SVG الخام وعرضها بشكل مضمن...

تظهر هذه التحذيرات أنه تم إنتاج مخرجات (إشعارات مهملة) قبل تعزيز الرأس، مما يجعل من المستحيل على استدعاءات header() اللاحقة أن تسري في تلك التشغيلات.

5.5 ملخص السبب الجذري

  • كود التعزيز لفرض التنزيلات وتعيين nosniff كان موجودًا، لكن لم يتم الوصول إليه في العديد من مسارات الكود بسبب الخروج المبكر والإخراج.
  • كما منعت إشعارات/تحذيرات PHP تعديل الرأس.
  • النتيجة العملية: روابط المشاركة (كل من مسارات كلمة المرور وغير كلمة المرور في بعض الحالات) أرجع HTML أو سمحت بطريقة أخرى للمتصفح بعرض SVG بشكل مضمن، مما ينفذ البرامج النصية المضمنة.

6. الإصلاح النهائي (v2.7.1) والتحقق

بعد تقارير السبب الجذري، طبق المسؤول تغييرات عالجت ترتيب التحكم في التدفق والإخراج. في v2.7.1:

  • يتم فرض تنزيل روابط مشاركة SVG/SVGZ (Content-Disposition: attachment).
  • يتم تقديم الملفات بنوع MIME آمن (application/octet-stream) لملفات SVG.
  • يتم تطبيق X-Content-Type-Options: nosniff.
  • يتم تنفيذ منطق رأس الأمان قبل أي إخراج، وتم تصحيح/معالجة نقاط exit; السابقة التي تجاوزت التعزيز.

التحقق النهائي (اختباري على v2.7.1):

الأمر: curl -svI "http://127.0.0.1:8080/api/file/share.php?token=fc911e48b0a30e9417a9020ef959784d" 2>&1 | grep -iE "content-type|content-disposition"

الملاحظ: < Content-Type: application/octet-stream < Content-Disposition: attachment; filename="xss-image.svg"; filename*=UTF-8''xss-image.svg

النتيجة: قام المتصفح بفرض تنزيل؛ لم يتم عرض SVG بشكل مضمن ولم يتم تنفيذ حمولة XSS. أعتبر الإصدار v2.7.1 قد حل المشكلة في بيئتي.


7. سياق قابلية استغلال CVSS

تقييم قابلية الاستغلال (تحليل المُبلِّغ)

  • يقيم CVSS الامتيازات المطلوبة في وقت الاستغلال، وليس في وقت الزرع.
  • توصيل الاستغلال هنا غير مصادق عليه: أي مستلم لرابط مشاركة عام (بما في ذلك المسؤولين) يمكنه تشغيل الحمولة دون مصادقة.
  • هذا يخلق سلاح إطلاق ونسيان: يزرع المهاجم ملفًا ضارًا، ويسجل الخروج، ويظل رابط المشاركة العام قابلاً للاستغلال.
  • لذلك فإن متجه CVSS الصحيح لـ السيناريو الأكثر خطورة واقعيًا هو:

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L — الدرجة: 9.6 (حرج)

لقد وثقت هذا الأساس المنطقي في سلسلة النشرات وطلبت استخدام PR:N.

تقييم المسؤول (كما نُشر)

  • قام المسؤول بتسجيل الامتيازات المطلوبة كـ منخفضة (PR:L) في النشرة الرسمية، بحجة أن تحميل/زرع الملف الضار يتطلب حسابًا أو رمزًا مميزًا لتمكين التحميل (قدرة مسبقة).
  • اعتبروا أن هذا المطلب جزء من امتيازات ما قبل الاستغلال وبالتالي استخدموا PR:L؛ لا يزال نص النشرة يلاحظ أن عناوين URL للمشاركة الناتجة يمكن فتحها بواسطة مستلمين غير مصادقين.

النتيجة الإدارية

  • تابع المسؤول لطلب CVE عبر GitHub ونشر نشرة GHSA مع PR:L (عالي 8.9).
  • تم طلب CVE عبر GitHub كجزء من عملية GHSA وتم نشره مع PR:L. تحتفظ هذه الوثيقة بتحليل المُبلِّغ التقني لخصائص قابلية الاستغلال من أجل الاكتمال والمرجع المستقبلي

يعكس متجه CVSS الخاص بـ CNA نموذج تهديد مقيدًا.

يظهر الاختبار التجريبي مسار استغلال أكثر شدة وقابلية للتكرار، والذي يتماشى مع درجة أساس CVSS 3.1 أعلى بموجب قواعد التسجيل القياسية.

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


8. الاستنتاج

  • كانت المشكلة تخزين XSS حقيقي حيث يمكن تقديم ملفات SVG بطريقة سمحت بالعرض المضمن وتنفيذ البرامج النصية.
  • النشرة السابقة (GHSA-qrcv-vjvf-fr29) خففت من عرض المعاينة لكنها لم تعالج نقاط نهاية المشاركة/التنزيل الخلفية؛ توثق GHSA-35pp-ggh6-c59c (CVE-2025-68116) هذا التجاوز.
  • السبب الجذري التقني الأساسي كان ترتيب التحكم في التدفق والإخراج قبل الرؤوس، مما منع تطبيق رؤوس الأمان في مسارات تنفيذ متعددة.
  • الإصلاح النهائي في v2.7.1 يصحح التحكم في التدفق، ويفرض تنزيلات لملفات SVG، ويطبق الرؤوس المناسبة؛ لقد تحققت من الإصلاح.
  • يتم توثيق التفسيرات المختلفة لامتيازات CVSS المطلوبة (PR:N مقابل PR:L) من أجل الشفافية

الملحق أ — الأدلة (أجزاء مختارة تم التقاطها أثناء التحقيق)

أ.1 فحص رأس الخروج المبكر (مخرجات awk، مختصرة)

1649 | header('Content-Type: application/json; charset=utf-8'); 1651 | exit; 1657 | header('Content-Type: application/json; charset=utf-8'); 1659 | exit; 1664 | header('Content-Type: application/json; charset=utf-8'); 1666 | exit; 1670 | header("Content-Type: text/html; charset=utf-8"); 1693 | exit; 1699 | header('Content-Type: application/json; charset=utf-8'); 1701 | exit; 1719 | header('Content-Type: application/json; charset=utf-8'); 1721 | exit; 1725 | header('Content-Type: application/json; charset=utf-8'); 1727 | exit;

تبدأ رؤوس الأمان عند ~1743: 1743 | header('X-Content-Type-Options: nosniff'); ... 1770 | header("Content-Disposition: attachment; ...");

أ.2 رأس curl لمشاركة غير محمية بكلمة مرور (سلوك ضعيف)

~/FileRise $ curl -svI "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" 2>&1 | grep -iE "content-type" < Content-Type: text/html; charset=UTF-8

أ.3 إشعارات "رؤوس أرسلت بالفعل" وإشعارات مهملة (عينة مخرجات خام)

Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1644


Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1645

Warning: Cannot modify header information - headers already sent by (output started at /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php:1644) in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1743

...متبوعًا بطباعة حمولة SVG وعرضها بشكل مضمن.

أ.4 التحقق النهائي (v2.7.1)

~/FileRise $ curl -svI "http://127.0.0.1:8080/api/file/share.php?token=fc911e48b0a30e9417a9020ef959784d" 2>&1 | grep -iE "content-type|content-disposition" < Content-Type: application/octet-stream < Content-Disposition: attachment; filename="xss-image.svg"; filename*=UTF-8''xss-image.svg

تنزيل الأداة