
Stirling-PDF v3.2.0 - عالية - عن بُعد - IDOR - جذر تخزين مجلد المعالجة يسرد ويستبدل ملفات PDF الخاصة بالأقران
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · stirling-storage-folder-idor
Stirling-PDF 3.2.0 - Stirling Tools
الفئة: IDOR. الوصول: عن بُعد ROLE_USER.
POST /api/v1/processing-folders لا يحتوي على @PreAuthorize يتجاوز كون المستخدم مسجّل الدخول. يُضمّن FolderAccessGuard كامل basePath للتخزين المحلي (./storage) حتى عندما يكون policies.allowedFolderRoots فارغًا. يكتب LocalStorageProvider المسار {ownerId}/{uuid}_{filename}. يمكن لمستخدم بدور ROLE_USER تعيين directory: "storage/<victimUserId>"، وسرد ملفات PDF الخاصة بذلك المالك، ومسحها في مكانها باستخدام replace=true.
المسار المباشر /api/v1/storage/files/{id} مُرقَّع (findByIdAndOwner). طلب GET المختبري لملف الضحية بصفة القرين يعيد 403. ما تبقّى هو الجذر الضمني لمجلد المعالجة، وليس واجهة CRUD الخاصة بالتخزين.
يسرد مستخدم بدور ROLE_USER أسماء ملفات PDF المخزّنة لمستخدم آخر ويستبدل تلك الكتل. تنزيل الضحية يعيد الملف المُعدَّل.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-639 / CWE-73 |
| CVSS | 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N |
| المنتج | Stirling-PDF |
| المتأثر | v3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754)، الصورة stirlingtools/stirling-pdf:3.2.0-fat، تسجيل الدخول مفعّل، storage.enabled=true |
| المصادقة | ROLE_USER على الفريق الافتراضي |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18154 فقط |
بقايا من سلسلة بقايا Stirling-PDF v3.2.0. الشقيق: stirling-h2-import-leftover (H2 CREATE OR REPLACE ALIAS). هذه الحزمة هي IDOR الخاص بالتخزين.
أي مستخدم بشري مسجّل الدخول بدور ROLE_USER على إصدار login-on proprietary/fat مع تفعيل التخزين المحلي (الافتراضي في القالب). ملف compose الرسمي هو login-off مع DISABLE_ADDITIONAL_FEATURES=true؛ ذلك النشر يعيد 403 لـ /api/v1/storage ويحذف هذا المتحكم. نشر HIT هو قالب login-on مع fat.
جدول الصلاحيات (شامل). نفس المعيار كـ Signal-Server Dropwizard admin.
| المحور | الطريقة + المسار | ما يمنحه | المصدر |
|---|---|---|---|
| الاستطلاع | ROLE_USER GET /api/v1/user/users | userId رقمي للمدير والقرين وSTIRLING-PDF-BACKEND-API-USER | مُثبت مختبريًا |
| الاستطلاع | POST /api/v1/processing-folders {directory:"storage/1"} ثم GET /api/v1/processing-folders/{id}/files | الاسم والحجم ووقت التعديل لملف PDF المخزّن الخاص بالمدير (5341de35-8729-49cf-92d0-c8284e05bfc5_victim-lab.pdf) | مُثبت مختبريًا |
| السلامة | POST /api/v1/processing-folders/{id}/sweep مع /api/v1/security/add-watermark ثم Range GET /api/v1/storage/files/1/download للضحية | إعادة كتابة في المكان. استجابة 206 / 3450 بايت للضحية تحتوي على STIRLING-STORAGE-FOLDER-IDOR-WITNESS | مُثبت مختبريًا (replace=true) |
| السرية | نفس المسح مع outputId للفريق / خطوة صادرة يمكن للمهاجم قراءتها | نسخة من بايتات ملف PDF الخاص بالضحية | مُستنتج. غير مطلوب للسرد/الاستبدال |
يبقى مغلقًا على هذا التثبيت
| المحور | الطريقة + المسار | سبب إغلاقه |
|---|---|---|
| الاستطلاع | GET /api/v1/storage/files/{id} لملف غير مشترك | 403 Access denied. مُثبت مختبريًا على معرّف الملف 1 |
| الاستطلاع | /api/v1/storage/** بدون مصادقة | 403 عند إيقاف تسجيل الدخول (ensureStorageEnabled) |
| السلامة | CRUD لمعرّف UUID للمجلد عبر المالكين | findByIdAndOwner |
| السلامة | LocalStorageProvider .. / مفتاح مطلق | Path.startsWith(basePath) بعد التطبيع |
| السلامة | صورة ultra-lite | وحدة تحكم مجلد المعالجة الاحتكارية غائبة |
GET /api/v1/user/users الذي يسرد STIRLING-PDF-BACKEND-API-USER هو مؤشر اختراق إضافي. لم أسجّله كبقايا مستقلة. تنزيل الضحية غير المُحدَّد النطاق يعيد 500 بعد الكتابة فوق الملف لأن FileStorageController لا يزال يعلن sizeBytes الأصلي من قاعدة البيانات. النطاق يعمل. نص العلامة المائية هو Identity-H في FlateDecode؛ والأوراكل يفكّ ضغط التدفقات.
أضاف الإصدار 3.x التخزين المحلي ومجلدات المعالجة. CRUD التخزين مقيّد بالمالك. تُرجع FolderAccessGuard.serverStorageRoots القيمة Path.of(basePath) للشجرة بأكملها، وليس basePath/{currentUserId}. وstorage/<victimId> يبدأ بـ startsWith ذلك الجذر الضمني.
ينشئ المختبر peeruser بدور ROLE_USER، ويرفع ملف PDF ضحية كمسؤول، ويثبت أن GET المباشر للتخزين يعيد 403، ويوجّه مجلد معالجة إلى storage/1، ويسرد الاسم المسبوق بـ UUID، ويمسح علامة مائية، ثم ينزّل عبر Range بصفتك الضحية.
مسارات خاطئة: التعامل مع IDOR المباشر للتخزين على أنه لا يزال مفتوحًا (403)؛ التعامل مع compose الرسمي بتسجيل الدخول المُعطَّل على أنه نشر HIT (تخزين 403، وحدة التحكم غائبة)؛ الادعاء بنسخة بايتات قابلة للقراءة من المهاجم دون outputId.
python3 stirling-storage-folder-idor-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18154. الصورة stirlingtools/stirling-pdf:3.2.0-fat. يتطلب Docker. تسجيل الدخول مفعّل. يقوم المشغّل chdir إلى lab/ ثم ينفّذ run.sh.
IOC direct-storage-get http=403
IOC processing-folders-save directory=storage/1 http=202
IOC listed-peer ... victim-lab.pdf
IOC victim-download attempt=1 http=206 bytes=3450 witness=1
SUCCESS stirling-storage-folder-idor direct-storage-403=yes listed-peer-pdf=yes download-has-witness=yes STIRLING-STORAGE-FOLDER-IDOR-WITNESS
قيّد جذر التخزين الضمني بـ basePath/{currentUserId} للقرص directory على الخوادم متعددة المستخدمين. ارفض storage/<otherId> بالطريقة التي يرفض بها findByIdAndOwner بالفعل معرّفات الملفات الأجنبية. أعد حساب sizeBytes المعلن عنه بعد إعادة الكتابة في المكان.
أعد تشغيل عميل الاسترجاع مقابل نسخة مُرقّعة: يجب أن يعيد directory=storage/1 بصفتك peeruser الخطأ 403، ويجب أن يبقى النظير المُدرج فارغًا.
حتى ذلك الحين، لا تعامل عبارة "لقد رقّعت /api/v1/storage/files/{id}" على أنها تعني "لقد قيّدت كل واجهة برمجية تأخذ مسار قرص تحت ./storage".
a7e593728dd9aa81e75318a949789d3c2e9ee754)استقبال المورّد: تبويب GitHub Security Advisory أو [email protected]. لن أفتح بلاغًا عامًا على Stirling-Tools/Stirling-PDF.
مختبرات أبراكساس https://abraxaslabs.tech https://github.com/abraxas [email protected]