
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
Write-up: https://abraxaslabs.tech/research/cakephp-attachment-crlf
Classe: iniezione di header nelle parti MIME Portata: remota
CakePHP 5.4.2 (887b641) - Cake Software Foundation
La 5.4.2 rimuove già ", \r e \n dai parametri multipart name= / filename= (FormDataPart::_headerParameterToString). Questo è il controllo. Content-Type e Content-ID sono stati lasciati come concatenazione grezza. Message::setAttachments copia il media type client di un UploadedFile in quel campo type senza alcun filtro aggiuntivo.
Un'applicazione che allega un upload dell'utente, o che passa un contentId fornito dall'utente, mette quei byte sulla parte MIME. getBodyString() mostra quindi una seconda riga di header sotto quella parte.
| ID | nessuna CVE al momento |
| Classe | iniezione di header nelle parti MIME |
| Portata | remota (applicazione che allega un upload dell'utente o un contentId fornito dall'utente) |
| CWE | CWE-93 |
| CVSS | Media: 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 fornito dall'utente |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Chi può influenzare i metadati degli allegati che l'applicazione passa a Message::setAttachments / addAttachment può iniettare header nelle parti MIME.
| Privilegio | Metodo / sink | Tipo | Dimostrato in lab o dedotto |
|---|---|---|---|
Riga di header Content-Type aggiuntiva | setAttachments con 'mimetype' => "text/plain\\r\\nX-Injected: …" | Integrità degli header delle parti MIME | Dimostrato in lab. Riga testimone presente |
Riga di header Content-ID aggiuntiva | 'contentId' => "cid@…>\\r\\nX-Injected: …" (parte inline) | Integrità degli header delle parti MIME | Dimostrato in lab. Riga testimone presente |
| Stessa iniezione tramite MIME dell'upload | UploadedFile::getClientMediaType() copiato su mimetype | Integrità degli header delle parti MIME | Dimostrato in lab. Riga testimone presente |
CRLF in filename= | nome dell'allegato con CR/LF | Chiuso | Dimostrato chiuso in lab. La rimozione della 5.4.2 regge |
RCPT dell'envelope / Bcc tramite questo sink | header delle parti MIME nel corpo | Chiuso | Si tratta della rimozione solo per coppie di SmtpTransport, un caso affine |
| Invio SMTP | il lab chiama solo getBodyString() | Chiuso | Nessun transport, nessuna shell |
Dedotto dalla stessa concatenazione, non dimostrato: un type o contentId costruito ad arte che includa un boundary multipart potrebbe suddividere il messaggio in parti aggiuntive in un MUA ricevente. Non ho inviato email.
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 in 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 tipo di client di upload senza alcuna rimozione. attachFiles / attachInlineFiles chiamano poi $part->type($fileInfo['mimetype']) e $part->contentId($fileInfo['contentId']).
Vicoli ciechi già registrati: trattare l'RCPT dell'envelope come questo residuo (la riga extra è nel corpo); sostenere che filename= inietti ancora (non lo fa); inviare SMTP; una reverse shell. Teatro.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
o
cd lab
./run.sh
Prendi di mira solo http://127.0.0.1:19460. PHP 8.3, CakePHP tag 5.4.2 clonato in fase di build. lab_server.php espone Message::setAttachments. Quattro casi: controllo del 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
Esegui type, contentId e transferEncoding attraverso la stessa rimozione di " / \r / \n usata da _headerParameterToString. Rifiuta il valore se contiene ancora un'interruzione di riga dopo la rimozione. Copri il MIME lato client di UploadedFile e mimetype / contentId espliciti nei test del mailer, non solo filename=.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= nella bakery 5.4.2GNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio loopback. Nessuna garanzia.