
FileRise Pro क्लाइंट पोर्टल्स के लिए /api/pro/portals/get.php के माध्यम से आंतरिक फ़ोल्डर पथ, क्लाइंट ईमेल, और अपलोड नीति का अनधिकृत प्रकटीकरण
get.php) में अनधिकृत सूचना प्रकटीकरणpublic/api/pro/portals/get.php किसी भी अनधिकृत कॉलर को, जो पोर्टल का slug जानता है या अनुमान लगा सकता है, FileRise Pro क्लाइंट पोर्टल का पूरा आंतरिक रिकॉर्ड लौटाता है — जिसमें उसका आंतरिक स्टोरेज फ़ोल्डर पथ, क्लाइंट का संपर्क ईमेल, और उसकी पूरी अपलोड नीति शामिल है।
उसी निर्देशिका में मौजूद हर सहोदर एंडपॉइंट (list.php, save.php, listEntries.php, submitForm.php, submissions.php) चलने से पहले fr_pro_guard_auth(...) को कॉल करता है; get.php एकमात्र अपवाद है। एप्लिकेशन पहले से ही उसी slug के लिए एक जानबूझकर तैयार किया गया सार्वजनिक एंडपॉइंट (publicMeta.php) प्रदान करता है जो केवल ब्रांडिंग फ़ील्ड लौटाता है — यह सिद्ध करता है कि यह डेटा प्रमाणीकरण से पहले उजागर करने के लिए नहीं है।
public/api/pro/portals/get.phpProPortalsApiService::getPortal() → PortalController::getPortalBySlug() (src/FileRise/Http/Controllers/PortalController.php:60)error311/FileRise @ टैग v3.23.1 पर (प्रोजेक्ट के अपने Dockerfile से बनाया गया, ताज़ा प्रथम-रन सेटअप)get.php बिना किसी प्रमाणीकरण गेट के चलता है:
require_once __DIR__ . '/../_common.php'; require_once PROJECT_ROOT . '/src/FileRise/Domain/ProPortalsApiService.php';
try { $slug = isset($_GET['slug']) ? (string)$_GET['slug'] : ''; fr_pro_emit_result(\FileRise\Domain\ProPortalsApiService::getPortal($slug)); } catch (Throwable $e) { ... }
इस फ़ाइल में कहीं भी fr_pro_guard_auth() कॉल नहीं है — इसके विपरीत list.php / save.php / listEntries.php सभी इसे पहले कॉल करते हैं।
getPortal() वही रिकॉर्ड लौटाता है जो एक एडमिन edit portal स्क्रीन पर देखता है, जिसमें संवेदनशील फ़ील्ड शामिल हैं:
return [
'slug' => ..., 'label' => ..., 'folder' => $folder, 'clientEmail' => $clientEmail,
'sourceId' => $sourceId, 'uploadOnly' => ..., 'allowDownload' => ...,
'uploadMaxSizeMb' => ..., 'uploadExtWhitelist' => ..., 'uploadMaxPerDay' => ...,
'allowSubfolders' => ..., 'formDefaults' => ..., 'canUpload' => $canUpload, ...
];
तुलना के लिए, publicMeta.php — वह एंडपॉइंट जिसे फ्रंट-एंड (public/js/portal.js) वास्तव में अनाम पोर्टल लैंडिंग पेज के लिए कॉल करता है — PortalPublicMetaService::getPublicPortalMeta() के माध्यम से एक अलग, न्यूनतम portals.json प्रोजेक्शन से लोड होता है और केवल ब्रांडिंग फ़ील्ड लौटाता है:
['slug', 'label', 'title', 'introText', 'brandColor', 'footerText', 'logoFile', 'logoUrl']
पूर्व शर्त पर: हमलावर को केवल एक पोर्टल slug जानने या अनुमान लगाने की आवश्यकता है — एक छोटा, मानव-पठनीय, एडमिन द्वारा चुना गया लेबल जो सीधे साझा करने योग्य पोर्टल URL (/portal/<slug>) में उपयोग होता है, न कि कोई उच्च-एन्ट्रॉपी रहस्य। Slugs नियमित रूप से ईमेल या लिंक के माध्यम से क्लाइंट के साथ साझा किए जाते हैं, इसलिए यह वास्तविक रूप से किसी भी ऐसे व्यक्ति द्वारा पहुँचा जा सकता है जिसने कभी पोर्टल लिंक प्राप्त किया हो।
error311/FileRise @ v3.23.1 के विरुद्ध लाइव सत्यापित, कमज़ोर अनुरोध पर शून्य कुकीज़/सेशन के साथ।
परीक्षण पर नोट: FileRise Pro (लाइसेंस प्राप्त
ProPortals.phpबंडल) एक अलग सशुल्क ऐड-ऑन है जो इस रिपॉज़िटरी में शामिल नहीं है। नीचे दिया गया PoC Pro मोड को एक न्यूनतम स्थानीय टेस्ट स्टब के साथ सक्रिय करता है जो केवल उसlistPortals()इंटरफ़ेस को लागू करता है जिसे OSS कोड पहले से ही कॉल करता है (PortalController.php:60→new ProPortals(FR_PRO_BUNDLE_DIR)→->listPortals())। यह बिल्कुल वही OSS-पक्षीय कोड पथ पुनरुत्पादित करता है जो हर वास्तविक लाइसेंस प्राप्त इंस्टेंस चलाता है; कोई स्वामित्व वाला कोड उपयोग या आवश्यक नहीं था।
1. इमेज बनाएँ:
git clone https://github.com/error311/FileRise.git
cd FileRise
docker build -t filerise-local -f Dockerfile .
2. न्यूनतम स्थानीय स्टब OSS-पक्षीय Pro गेटिंग कोड को चलाने के लिए (स्वामित्व वाला बंडल नहीं — बस FR_PRO_ACTIVE / ProPortals::listPortals() को संतुष्ट करने के लिए पर्याप्त):
mkdir -p data/users/pro
cat > data/users/pro/bootstrap_pro.php <<'PHP'
<?php
define('FR_PRO_ACTIVE', true);
PHP
cat > data/users/pro/ProPortals.php <<'PHP'
<?php
class ProPortals {
public function __construct(string $dir) {}
public function listPortals(): array {
return ['client-portal' => [
'label' => 'Client Portal',
'folder' => 'confidential/client-acme-contracts',
'clientEmail' => '[email protected]',
'uploadOnly' => true, 'allowDownload' => false,
'uploadMaxSizeMb' => 25, 'uploadExtWhitelist' => 'pdf,docx', 'uploadMaxPerDay' => 10,
]];
}
}
PHP