
CakePHP 5.4.2 - उच्च - रिमोट - CRLF - attachment Content-Type और Content-ID अवशेष
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
राइट-अप: https://abraxaslabs.tech/research/cakephp-attachment-crlf
वर्ग: MIME-भाग हेडर इंजेक्शन पहुँच: रिमोट
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.4.2 पहले से ही multipart name= / filename= से ", \r, और \n को हटा देता है (FormDataPart::_headerParameterToString)। यही नियंत्रण है। Content-Type और Content-ID को कच्चे संयोजन के रूप में छोड़ दिया गया था। Message::setAttachments किसी UploadedFile क्लाइंट मीडिया प्रकार को बिना किसी अतिरिक्त फ़िल्टर के उस प्रकार फ़ील्ड में कॉपी कर देता है।
कोई ऐप जो उपयोगकर्ता अपलोड संलग्न करता है, या जो उपयोगकर्ता contentId पास करता है, वह उन बाइट्स को MIME भाग पर रख देता है। फिर getBodyString() उस भाग के नीचे एक दूसरी हेडर पंक्ति दिखाता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | MIME-भाग हेडर इंजेक्शन |
| पहुँच | रिमोट (ऐप जो उपयोगकर्ता अपलोड या उपयोगकर्ता contentId संलग्न करता है) |
| CWE | CWE-93 |
| CVSS | मध्यम: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N |
| उत्पाद | CakePHP |
| प्रभावित | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| प्रमाणीकरण | ऐप जो उपयोगकर्ता अपलोड (UploadedFile क्लाइंट MIME) या उपयोगकर्ता contentId संलग्न करता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
कोई भी व्यक्ति जो ऐप द्वारा Message::setAttachments / addAttachment में पास किए जाने वाले अटैचमेंट मेटाडेटा को प्रभावित कर सकता है, वह MIME-भाग हेडर इंजेक्ट कर सकता है।
| विशेषाधिकार | विधि / सिंक | प्रकार | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
अतिरिक्त Content-Type हेडर पंक्ति | setAttachments के साथ 'mimetype' => "text/plain\\r\\nX-Injected: …" | MIME भाग हेडर की अखंडता | लैब-प्रमाणित। साक्षी पंक्ति मौजूद |
अतिरिक्त Content-ID हेडर पंक्ति | 'contentId' => "cid@…>\\r\\nX-Injected: …" (इनलाइन भाग) | MIME भाग हेडर की अखंडता | लैब-प्रमाणित। साक्षी पंक्ति मौजूद |
| अपलोड MIME के माध्यम से वही इंजेक्शन | UploadedFile::getClientMediaType() को mimetype पर कॉपी किया गया | MIME भाग हेडर की अखंडता | लैब-प्रमाणित। साक्षी पंक्ति मौजूद |
filename= CRLF | CR/LF वाला अटैचमेंट नाम | बंद | लैब-प्रमाणित बंद। 5.4.2 स्ट्रिप कायम है |
इस सिंक के माध्यम से एनवेलप RCPT / Bcc | बॉडी में MIME भाग हेडर | बंद | यह SmtpTransport का pair-only स्ट्रिप है, एक सहोदर |
| SMTP भेजना | लैब केवल getBodyString() कॉल करता है | बंद | कोई ट्रांसपोर्ट नहीं, कोई शेल नहीं |
उसी संयोजन से अनुमानित, प्रदर्शित नहीं: एक तैयार किया गया प्रकार या contentId जिसमें multipart बाउंड्री शामिल हो, प्राप्त करने वाले MUA में संदेश को अतिरिक्त भागों में विभाजित कर सकता है। मैंने मेल नहीं भेजा।
उसी पिन के अवशेष: window SQLi, collate SQLi, cache unserialize।
मैंने cakephp/cakephp 5.4.2 को पिन किया, उस बेकरी नोट के बाद जिसमें कहा गया था कि multipart Content-Disposition filename= इंजेक्शन ठीक कर दिया गया है। _headerParameterToString सैनिटाइज़र है:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() अभी भी यह करता है:
if ($this->type) {
$out .= 'Content-Type: ' . $this->type . "\r\n";
}
if ($this->contentId) {
$out .= 'Content-ID: <' . $this->contentId . ">\r\n";
}
Message::setAttachments अपलोड क्लाइंट प्रकार को बिना स्ट्रिप के कॉपी करता है। इसके बाद attachFiles / attachInlineFiles $part->type($fileInfo['mimetype']) और $part->contentId($fileInfo['contentId']) को कॉल करते हैं।
पहले से दर्ज गलत मोड़: envelope RCPT को इस अवशेष के रूप में मानना (अतिरिक्त पंक्ति बॉडी में है); यह दावा करना कि filename= अभी भी इंजेक्ट करता है (यह नहीं करता); SMTP भेजना; एक रिवर्स शेल। नाटक।
python3 cakephp-attachment-crlf-Abraxas-Labs.py
या
cd lab
./run.sh
केवल http://127.0.0.1:19460 को लक्षित करें। PHP 8.3, CakePHP टैग 5.4.2 बिल्ड के समय क्लोन किया गया। lab_server.php Message::setAttachments को उजागर करता है। चार केस: filename नियंत्रण, mimetype, contentId, UploadedFile मीडिया प्रकार।
SUCCESS cakephp-attachment-crlf how=live pin=5.4.2 sha=887b641de9f7aba06071f98f17edcbc573cbcf63 mimetype=yes contentId=yes upload=yes filename-stripped=yes CAKEPHP-ATTACHMENT-CRLF-WITNESS
type, contentId, और transferEncoding को उसी " / \r / \n स्ट्रिप से गुज़ारें जो _headerParameterToString में उपयोग होता है। यदि स्ट्रिप के बाद भी मान में लाइन ब्रेक बचा हो तो उसे अस्वीकार करें। मेलर परीक्षणों में केवल filename= ही नहीं, बल्कि UploadedFile क्लाइंट MIME और स्पष्ट mimetype / contentId को भी कवर करें।
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= स्ट्रिपGNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।