
Stirling-PDF v3.2.0 - उच्च - रिमोट - IDOR - processing-folder स्टोरेज रूट सूचीबद्ध करता है और सहकर्मी PDFs को अधिलेखित करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · stirling-storage-folder-idor
Stirling-PDF 3.2.0 - Stirling Tools
Class: IDOR. Reach: Remote ROLE_USER.
POST /api/v1/processing-folders में लॉग-इन उपयोगकर्ता के अलावा कोई @PreAuthorize नहीं है। FolderAccessGuard पूरे लोकल स्टोरेज basePath (./storage) को निहित करता है, भले ही policies.allowedFolderRoots खाली हो। LocalStorageProvider {ownerId}/{uuid}_{filename} लिखता है। एक ROLE_USER directory: "storage/<victimUserId>" सेट कर सकता है, उस owner की PDFs को सूचीबद्ध कर सकता है, और replace=true के साथ उन्हें जगह पर ही बदल सकता है।
सीधा /api/v1/storage/files/{id} पैच किया गया है (findByIdAndOwner)। पीयर के रूप में पीड़ित फ़ाइल का लैब GET 403 है। जो बचा है वह प्रोसेसिंग-फ़ोल्डर का निहित रूट है, स्टोरेज CRUD API नहीं।
एक ROLE_USER किसी अन्य उपयोगकर्ता की संग्रहीत PDF नामों को सूचीबद्ध करता है और उन ब्लॉब्स को अधिलेखित करता है। पीड़ित का डाउनलोड छेड़छाड़ की गई फ़ाइल लौटाता है।
| ID | अभी तक कोई 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 |
| Product | Stirling-PDF |
| Affected | v3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754), image stirlingtools/stirling-pdf:3.2.0-fat, login-on, storage.enabled=true |
| Auth | डिफ़ॉल्ट टीम पर ROLE_USER |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18154 |
Stirling-PDF v3.2.0 leftovers श्रृंखला का अवशेष। सहोदर: stirling-h2-import-leftover (H2 CREATE OR REPLACE ALIAS)। यह पैक स्टोरेज IDOR है।
कोई भी लॉग-इन मानव ROLE_USER जो login-on proprietary/fat पर लोकल स्टोरेज सक्षम (टेम्पलेट डिफ़ॉल्ट) के साथ है। आधिकारिक compose login-off प्लस DISABLE_ADDITIONAL_FEATURES=true है; वह डिप्लॉय /api/v1/storage पर 403 देता है और इस कंट्रोलर को छोड़ देता है। HIT डिप्लॉय टेम्पलेट login-on प्लस fat है।
विशेषाधिकार तालिका (पूर्ण)। Signal-Server Dropwizard admin के समान मानक।
| Axis | Method + path | Grants | Provenance |
|---|---|---|---|
| Recon | ROLE_USER GET /api/v1/user/users | admin, peer, और STIRLING-PDF-BACKEND-API-USER के लिए संख्यात्मक userId | लैब-प्रमाणित |
| Recon | POST /api/v1/processing-folders {directory:"storage/1"} फिर GET /api/v1/processing-folders/{id}/files | admin की संग्रहीत PDF का नाम, आकार, mtime (5341de35-8729-49cf-92d0-c8284e05bfc5_victim-lab.pdf) | लैब-प्रमाणित |
| Integrity | 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) |
| Confidentiality | वही sweep प्लस एक टीम outputId / आउटबाउंड चरण जिसे हमलावर पढ़ सकता है | पीड़ित PDF बाइट्स की प्रतिलिपि | अनुमानित। सूचीबद्ध करने/अधिलेखित करने के लिए आवश्यक नहीं |
इस पिन पर बंद रहता है
| अक्ष | विधि + पथ | यह क्यों बंद है |
|---|---|---|
| रेकॉन | किसी गैर-साझा फ़ाइल का GET /api/v1/storage/files/{id} | 403 Access denied। फ़ाइल id 1 पर लैब-प्रमाणित |
| रेकॉन | अन-ऑथ /api/v1/storage/** | लॉगिन बंद होने पर 403 (ensureStorageEnabled) |
| अखंडता | मालिकों के बीच फ़ोल्डर UUID CRUD | findByIdAndOwner |
| अखंडता | LocalStorageProvider .. / निरपेक्ष कुंजी | normalize के बाद Path.startsWith(basePath) |
| अखंडता | अल्ट्रा-लाइट इमेज | प्रोप्राइटरी प्रोसेसिंग-फ़ोल्डर कंट्रोलर अनुपस्थित |
GET /api/v1/user/users जो STIRLING-PDF-BACKEND-API-USER को सूचीबद्ध करता है, अतिरिक्त IOC है। मैंने इसे इसके अपने लेफ्टओवर के रूप में दर्ज नहीं किया। ओवरराइट के बाद अन-रेंज्ड विक्टिम डाउनलोड 500 देता है क्योंकि FileStorageController अभी भी मूल DB sizeBytes का विज्ञापन करता है। Range काम करता है। वॉटरमार्क टेक्स्ट FlateDecode में Identity-H है; ओरेकल स्ट्रीम्स को इन्फ्लेट करता है।
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 आवश्यक है। लॉगिन-ऑन। लॉन्चर lab/ में chdir करता है और run.sh को exec करता है।
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
मल्टी-यूज़र सर्वर पर डिस्क directory के लिए निहित स्टोरेज रूट को basePath/{currentUserId} तक सीमित करें। storage/<otherId> को उसी तरह अस्वीकार करें जैसे findByIdAndOwner पहले से ही बाहरी फ़ाइल आईडी को अस्वीकार करता है। इन-प्लेस रीराइट के बाद विज्ञापित sizeBytes की पुनर्गणना करें।
पैच किए गए बिल्ड के विरुद्ध लूपबैक क्लाइंट को फिर से चलाएँ: peeruser के रूप में directory=storage/1 को 403 देना चाहिए, और सूचीबद्ध-पीयर खाली ही रहना चाहिए।
तब तक, "मैंने /api/v1/storage/files/{id} को पैच कर दिया" को "मैंने ./storage के अंतर्गत डिस्क पाथ लेने वाले हर API को सीमित कर दिया" के रूप में न मानें।
a7e593728dd9aa81e75318a949789d3c2e9ee754)विक्रेता इनटेक: GitHub Security Advisory टैब या [email protected]। मैं Stirling-Tools/Stirling-PDF पर सार्वजनिक इश्यू नहीं खोल रहा हूँ।