
CakePHP 5.4.2 - Alto - Remoto - CRLF - attachment Content-Type e Content-ID residui
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
Classe: MIME-part header injection Reach: Remoto
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.4.2 rimuove già ", \r e \n dai multipart name= / filename= (FormDataPart::_headerParameterToString). Questo è il controllo. Content-Type e Content-ID sono stati lasciati come concatenazione grezza. Message::setAttachments copia il client media type di un UploadedFile in quel campo type senza alcun filtro aggiuntivo.
Un'app che allega un upload dell'utente, o che passa un contentId dell'utente, mette quei byte sulla MIME part. getBodyString() mostra quindi una seconda riga di header sotto quella part.
| ID | nessuna CVE al momento |
| Classe | MIME-part header injection |
| Reach | Remoto (app che allega un upload dell'utente o un contentId dell'utente) |
| 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 |
| Prodotto | CakePHP |
| Affetto | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | applicazione che allega un upload dell'utente (MIME client di UploadedFile) o un contentId dell'utente |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Chi può influenzare i metadati degli allegati che l'app passa a Message::setAttachments / addAttachment può iniettare header di MIME-part.
| Privilegio | Metodo / sink | Tipo | Provato in lab o dedotto |
|---|---|---|---|
Riga header Content-Type aggiuntiva | setAttachments con 'mimetype' => "text/plain\\r\\nX-Injected: …" | Integrità degli header della MIME part | Provato in lab. Riga witness presente |
Riga header Content-ID aggiuntiva | 'contentId' => "cid@…>\\r\\nX-Injected: …" (part inline) | Integrità degli header della MIME part | Provato in lab. Riga witness presente |
| Stessa iniezione tramite MIME dell'upload | UploadedFile::getClientMediaType() copiato su mimetype | Integrità degli header della MIME part | Provato in lab. Riga witness presente |
CRLF in filename= | nome allegato con CR/LF | Chiuso | Provato chiuso in lab. Lo strip di 5.4.2 regge |
RCPT envelope / Bcc tramite questo sink | header di MIME part nel body | Chiuso | È lo strip solo-coppia di SmtpTransport, un sibling |
| Invio SMTP | il lab chiama solo getBodyString() | Chiuso | Nessun transport, nessuna shell |
Dedotto dalla stessa concatenazione, non dimostrato: un type o contentId craftato che include un boundary multipart potrebbe dividere il messaggio in part extra in un MUA ricevente. Non ho inviato mail.
Altri residui dello stesso pin: window SQLi, collate SQLi, cache unserialize.
Ho fissato cakephp/cakephp 5.4.2 dopo la nota della bakery secondo cui l'iniezione multipart Content-Disposition filename= era stata corretta. _headerParameterToString è il sanitizer:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() fa ancora:
if ($this->type) {
$out .= 'Content-Type: ' . $this->type . "\r\n";
}
if ($this->contentId) {
$out .= 'Content-ID: <' . $this->contentId . ">\r\n";
}
Message::setAttachments copia il client type dell'upload senza strip. attachFiles / attachInlineFiles chiamano poi $part->type($fileInfo['mimetype']) e $part->contentId($fileInfo['contentId']).
Vicoli ciechi già registrati: trattare l'RCPT envelope come questo residuo (la riga extra è nel body); sostenere che filename= inietti ancora (non lo fa); inviare SMTP; una reverse shell. Teatro.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19460. PHP 8.3, tag CakePHP 5.4.2 clonato in build. lab_server.php espone Message::setAttachments. Quattro casi: controllo filename, mimetype, contentId, media type di 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
Far passare type, contentId e transferEncoding attraverso lo stesso strip di " / \r / \n di _headerParameterToString. Rifiutare il valore se contiene ancora un line break dopo lo strip. Coprire il MIME client di UploadedFile e i mimetype / contentId espliciti nei test del mailer, non solo filename=.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= della bakery 5.4.2GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.