
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
Klasse: MIME-Part-Header-Injection Reichweite: Remote
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.4.2 entfernt bereits ", \r und \n aus multipart name= / filename= (FormDataPart::_headerParameterToString). Das ist die Kontrolle. Content-Type und Content-ID wurden als rohe Verkettung belassen. Message::setAttachments kopiert einen UploadedFile-Client-Media-Type in dieses Typ-Feld ohne zusätzlichen Filter.
Eine App, die einen Benutzer-Upload anhängt oder die eine Benutzer-contentId übergibt, platziert diese Bytes auf dem 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 Benutzer-contentId anhängt) |
| CWE | CWE-93 |
| CVSS | Medium: 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 anhängt (UploadedFile-Client-MIME) oder eine Benutzer-contentId |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Jemand, der Attachment-Metadaten beeinflussen kann, die die App in Message::setAttachments / addAttachment übergibt, kann MIME-Part-Header injizieren.
| Privileg | Methode / Sink | Art | Lab-bewiesen oder abgeleitet |
|---|---|---|---|
Zusätzliche Content-Type-Header-Zeile | setAttachments mit 'mimetype' => "text/plain\\r\\nX-Injected: …" | Integrität der MIME-Part-Header | Lab-bewiesen. Witness-Zeile vorhanden |
Zusätzliche Content-ID-Header-Zeile | 'contentId' => "cid@…>\\r\\nX-Injected: …" (Inline-Part) | Integrität der MIME-Part-Header | Lab-bewiesen. Witness-Zeile vorhanden |
| Dieselbe Injection über Upload-MIME | UploadedFile::getClientMediaType() kopiert auf mimetype | Integrität der MIME-Part-Header | Lab-bewiesen. Witness-Zeile vorhanden |
filename= CRLF | Attachment-Name mit CR/LF | Geschlossen | Lab-bewiesen geschlossen. 5.4.2-Strip hält |
Envelope RCPT / Bcc über diesen Sink | MIME-Part-Header im Body | Geschlossen | Das ist SmtpTransport pair-only-Strip, ein Geschwister |
| SMTP-Versand | Lab ruft nur getBodyString() auf | Geschlossen | Kein Transport, keine Shell |
Abgeleitet aus derselben Verkettung, nicht demonstriert: ein präparierter Type oder contentId, der eine Multipart-Boundary enthält, könnte die Nachricht in einem empfangenden MUA in zusätzliche Parts aufteilen. Ich habe keine Mail versendet.
Gleiche Pin-Überreste: window SQLi, collate SQLi, cache unserialize.
Ich habe cakephp/cakephp 5.4.2 gepinnt, nachdem die Bakery-Notiz besagte, dass multipart Content-Disposition filename=-Injection behoben wurde. _headerParameterToString ist der Sanitizer:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() macht weiterhin:
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-Type ohne Strip. attachFiles / attachInlineFiles rufen dann $part->type($fileInfo['mimetype']) und $part->contentId($fileInfo['contentId']) auf.
Bereits festgehaltene Irrwege: Envelope RCPT als diesen Überrest behandeln (die zusätzliche Zeile ist im Body); behaupten, filename= injiziere weiterhin (tut es nicht); SMTP senden; eine Reverse Shell. Theater.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur http://127.0.0.1:19460. PHP 8.3, CakePHP-Tag 5.4.2 beim Build geklont. lab_server.php exponiert Message::setAttachments. Vier Fälle: filename-Kontrolle, mimetype, contentId, UploadedFile-Media-Type.
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 und transferEncoding durch denselben " / \r / \n-Strip wie _headerParameterToString laufen lassen. Den Wert ablehnen, wenn er nach dem Strip noch einen Zeilenumbruch enthält. UploadedFile-Client-MIME und explizites mimetype / contentId in den Mailer-Tests abdecken, nicht nur filename=.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename=-StripGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.