
Mautic < 5.2.3 प्रमाणीकृत RCE
एसेट संपादन फीचर में अपलोड की गई फ़ाइल की सामग्री, प्रकार और एक्सटेंशन की खराब सैनिटाइज़ेशन एक प्रमाणित हमलावर को वेब डायरेक्टरी के अंदर मनमाना PHP कोड लिखने और यह पता लगाने की अनुमति देती है कि फ़ाइल कहाँ लिखी गई है। इसका परिणाम रिमोट कोड एक्ज़ेक्यूशन होता है।
पाथ ट्रैवर्सल भी इस कार्यक्षमता का फायदा उठाकर फाइलसिस्टम पर किसी भी निर्देशिका को पुनरावर्ती रूप से हटाने की अनुमति देता है, जिसे वेब-यूज़र संशोधित करने की अनुमति रखता है।

जब /assets/view/{assetID} रूट के माध्यम से किसी एसेट को संपादित किया जाता है, तो एसेट की फ़ाइल को बदलने की संभावना दी जाती है।
नई फ़ाइल अपलोड करने पर अंततः app/Bundles/AssetBundle/Controller/AssetController.php के अंदर निम्नलिखित फ़ंक्शन कॉल होता है:
public function editAction(Request $request, UploaderHelper $uploaderHelper, AssetModel $model, $objectId, $ignorePost = false)
अपलोड लॉजिक यहाँ पाया जा सकता है:
if (!$ignorePost && 'POST' == $method) {
$valid = false;
if (!$cancelled = $this->isFormCancelled($form)) {
if ($valid = $this->isFormValid($form)) {
$entity->setUploadDir($this->coreParametersHelper->get('upload_dir'));
$entity->preUpload();
$entity->upload();
अधिक विशेष रूप से, हम preUpload() और upload() मेथड्स में रुचि रखते हैं, क्योंकि ये डिस्क पर वास्तविक फ़ाइल लेखन को संभालते हैं।
पहला दोष app/Bundles/AssetBundle/Entity/Asset.php में preUpload() में है, क्योंकि यह कार्यान्वयन हमें एक मनमाना फ़ाइल एक्सटेंशन निर्दिष्ट करने की अनुमति देता है (इस प्रकार सामान्यतः allowed_extensions array द्वारा प्रदत्त सुरक्षा को दरकिनार करता है):
$filename = sha1(uniqid(mt_rand(), true));
$extension = $this->getFile()->guessExtension();
if (empty($extension)) {
// get it from the original name
$extension = pathinfo($this->originalFileName, PATHINFO_EXTENSION);
}
$this->path = $filename.'.'.$extension;
यदि हम .php पर समाप्त होने वाली फ़ाइल का नाम और <?php टैग से शुरू होने वाली सामग्री प्रदान करते हैं, तो $extension = $this->getFile()->guessExtension(); पंक्ति NULL लौटाएगी।
इसलिए empty($extension) जाँच सत्य (true) होगी, और फ़ाइल एक्सटेंशन फिर pathinfo() कॉल के माध्यम से निकाला जाएगा, जिससे हम मनमानी सामग्री और एक्सटेंशन के साथ अस्थायी फ़ाइलें अपलोड कर सकते हैं। हम फ़ाइल के वास्तविक नाम को नियंत्रित नहीं कर सकते क्योंकि यह sha1() के साथ उत्पन्न होता है।
फिर, अगले upload() मेथड के अंदर, फ़ाइल वास्तव में निम्नलिखित कॉल के माध्यम से वेब डायरेक्टरी के अंदर डिस्क पर लिखी जाएगी:
$this->getFile()->move($this->getUploadDir(), $this->path);
यह हमारे मनमाने एक्सटेंशन ($this->path वेरिएबल में निहित) का उपयोग कर रहा है। फ़ाइल का नाम फिर Asset विवरण पृष्ठ (/assets/view/{assetId}) को रीफ़्रेश करके, Local filename तालिका प्रविष्टि के अंतर्गत प्राप्त किया जा सकता है।
नोट : यह नया Asset बनाते समय भेजे गए अनुरोधों को बदलकर भी काम करता है। यह newAction() फ़ंक्शन को कॉल करेगा, लेकिन लॉजिक समान है, और दोष अभी भी preUpload() और upload() मेथड्स में हैं।
PoC अगले एक महीने या उसके आसपास प्रकाशित नहीं किया जाएगा।
यह उन संगठनों को समय देने के लिए है जो इस सॉफ़्टवेयर पर निर्भर हैं, ताकि वे स्क्रिप्ट किडीज़ द्वारा अपनी चीज़ें खराब किए जाने के डर के बिना इसे पैच कर सकें।
उसके बाद, इस रेपो को पूर्ण एक्सप्लॉइटेशन स्क्रिप्ट और प्रमाणों के साथ अपडेट किया जाएगा। इस पृष्ठ पर पहले से ही पर्याप्त जानकारी है।
अस्थायी अपलोड को मान्य करते समय (/s/assets/new या /s/assets/edit/{assetId} के माध्यम से), अस्थायी फ़ाइल को संग्रहीत करने वाली निर्देशिका अनुरोध के अंत में पुनरावर्ती रूप से हटा दी जाती है। अस्थायी निर्देशिका का नाम रखने के लिए ज़िम्मेदार पैरामीटर पाथ ट्रैवर्सल हमलों के लिए अतिसंवेदनशील है, जो एक प्रमाणित हमलावर को सिस्टम पर किसी भी निर्देशिका को हटाने की अनुमति देता है, बशर्ते कि वेब यूज़र के पास ऐसा करने की अनुमति हो। इसके परिणामस्वरूप डेटा हानि हो सकती है, या यदि सर्वर रूट यूज़र द्वारा निष्पादित होता है तो पूरे फाइलसिस्टम का विनाश भी हो सकता है।
नीचे उपयोग किए गए एंडपॉइंट के माध्यम से सिस्टम पर मौजूद किसी भी फ़ाइल को निर्दिष्ट करें। यदि फ़ाइल मौजूद है, तो सर्वर उस निर्देशिका को हटाने का प्रयास करेगा जिसमें वह संग्रहीत है।

सर्वर अधिग्रहण सेवा से वंचित डेटा हानि