
CakePHP 5.4.2 – Hoch – Remote – CRLF – Content-Type und Content-ID von Anhängen verbleiben
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
Write-up: https://abraxaslabs.tech/research/cakephp-attachment-crlf
Klasse: MIME-Part-Header-Injection Reichweite: Remote
CakePHP 5.4.2 (887b641) – Cake Software Foundation
5.4.2 entfernt bereits ", \r und \n aus den Multipart-Parametern name= / filename= (FormDataPart::_headerParameterToString). Das ist die Kontrolle. Content-Type und Content-ID wurden als rohe Verkettung belassen. Message::setAttachments kopiert den Client-Media-Type einer UploadedFile ohne zusätzlichen Filter in dieses Typfeld.
Eine App, die einen Benutzer-Upload anhängt oder eine benutzerseitige contentId durchreicht, platziert diese Bytes im MIME-Part. getBodyString() zeigt dann eine zweite Header-Zeile unter diesem Part.
| ID | noch keine CVE |
| Klasse | MIME-Part-Header-Injection |
| Reichweite | Remote (App, die einen Benutzer-Upload oder eine benutzerseitige contentId anhängt) |
| CWE | CWE-93 |
| CVSS | Mittel: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N |
| Produkt | CakePHP |
| Betroffen | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | Anwendung, die einen Benutzer-Upload (Client-MIME der UploadedFile) oder eine benutzerseitige contentId anhängt |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Wer die Attachment-Metadaten beeinflussen kann, die die App an Message::setAttachments / addAttachment übergibt, kann MIME-Part-Header injizieren.
| Privileg | Methode / Sink | Art | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
Zusätzliche Content-Type-Header-Zeile | setAttachments mit 'mimetype' => "text/plain\\r\\nX-Injected: …" | Integrität der MIME-Part-Header | Im Lab nachgewiesen. Witness-Zeile vorhanden |
Zusätzliche Content-ID-Header-Zeile | 'contentId' => "cid@…>\\r\\nX-Injected: …" (Inline-Part) | Integrität der MIME-Part-Header | Im Lab nachgewiesen. Witness-Zeile vorhanden |
| Dieselbe Injection über Upload-MIME | UploadedFile::getClientMediaType() auf mimetype kopiert | Integrität der MIME-Part-Header | Im Lab nachgewiesen. Witness-Zeile vorhanden |
filename= CRLF | Attachment-Name mit CR/LF | Geschlossen | Im Lab als geschlossen nachgewiesen. Strip in 5.4.2 hält |
Envelope-RCPT / Bcc über diesen Sink | MIME-Part-Header im Body | Geschlossen | Das ist der Pair-only-Strip von SmtpTransport, ein verwandter Fall |
| SMTP-Versand | Lab ruft nur getBodyString() auf | Geschlossen | Kein Transport, keine Shell |
Aus derselben Verkettung abgeleitet, nicht demonstriert: Ein präparierter Typ oder eine präparierte contentId, die eine Multipart-Boundary enthält, könnte die Nachricht in einem empfangenden MUA in zusätzliche Parts aufteilen. Ich habe keine Mail versendet.
Weitere Überbleibsel derselben Pin-Version: window SQLi, collate SQLi, cache unserialize.
Ich habe cakephp/cakephp 5.4.2 gepinnt, nachdem der Bakery-Hinweis erschien, dass die Multipart-Content-Disposition-filename=-Injection behoben sei. _headerParameterToString ist der Sanitizer:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() macht immer noch:
if ($this->type) {
$out .= 'Content-Type: ' . $this->type . "\r\n";
}
if ($this->contentId) {
$out .= 'Content-ID: <' . $this->contentId . ">\r\n";
}
Message::setAttachments kopiert den Upload-Client-Typ ohne Strip. attachFiles / attachInlineFiles rufen dann $part->type($fileInfo['mimetype']) und $part->contentId($fileInfo['contentId']) auf.
Bereits festgehaltene Fehlversuche: das Envelope-RCPT als diesen Überrest zu behandeln (die zusätzliche Zeile befindet sich im Body); zu behaupten, filename= injiziere weiterhin (das tut es nicht); SMTP zu senden; eine Reverse Shell. Theater.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziele nur http://127.0.0.1:19460. PHP 8.3, CakePHP-Tag 5.4.2 beim Build geklont. lab_server.php stellt Message::setAttachments bereit. Vier Fälle: Dateinamen-Kontrolle, Mimetype, contentId, UploadedFile-Medientyp.
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
Führe type, contentId und transferEncoding durch dieselbe " / \r / \n-Bereinigung wie _headerParameterToString. Lehne den Wert ab, wenn er nach der Bereinigung noch einen Zeilenumbruch enthält. Decke den Client-MIME von UploadedFile sowie explizites mimetype / contentId in den Mailer-Tests ab, nicht nur filename=.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename=-BereinigungGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.