
CakePHP 5.4.2 - Alta - Remota - CRLF - attachment Content-Type y Content-ID residual
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
Clase: Inyección de cabeceras en partes MIME Alcance: Remoto
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.4.2 ya elimina ", \r y \n de name= / filename= en multipart (FormDataPart::_headerParameterToString). Ese es el control. Content-Type y Content-ID quedaron como concatenación directa. Message::setAttachments copia el tipo MIME de cliente de un UploadedFile en ese campo de tipo sin filtro adicional.
Una aplicación que adjunta una subida de usuario, o que pasa un contentId de usuario, coloca esos bytes en la parte MIME. getBodyString() muestra entonces una segunda línea de cabecera bajo esa parte.
| ID | sin CVE todavía |
| Clase | Inyección de cabeceras en partes MIME |
| Alcance | Remoto (aplicación que adjunta una subida de usuario o un contentId de usuario) |
| CWE | CWE-93 |
| CVSS | Medio: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N |
| Producto | CakePHP |
| Afectado | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Autenticación | aplicación que adjunta una subida de usuario (MIME de cliente de UploadedFile) o un contentId de usuario |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Alguien que pueda influir en los metadatos de adjuntos que la aplicación pasa a Message::setAttachments / addAttachment puede inyectar cabeceras en partes MIME.
| Privilegio | Método / sink | Tipo | Probado en laboratorio o inferido |
|---|---|---|---|
Línea de cabecera Content-Type adicional | setAttachments con 'mimetype' => "text/plain\\r\\nX-Injected: …" | Integridad de las cabeceras de la parte MIME | Probado en laboratorio. Línea testigo presente |
Línea de cabecera Content-ID adicional | 'contentId' => "cid@…>\\r\\nX-Injected: …" (parte inline) | Integridad de las cabeceras de la parte MIME | Probado en laboratorio. Línea testigo presente |
| Misma inyección vía MIME de subida | UploadedFile::getClientMediaType() copiado en mimetype | Integridad de las cabeceras de la parte MIME | Probado en laboratorio. Línea testigo presente |
CRLF en filename= | nombre de adjunto con CR/LF | Cerrado | Probado en laboratorio como cerrado. La eliminación de 5.4.2 se mantiene |
RCPT de sobre / Bcc vía este sink | cabeceras de partes MIME en el cuerpo | Cerrado | Eso es la eliminación solo de pares de SmtpTransport, un caso hermano |
| Envío SMTP | el laboratorio solo llama a getBodyString() | Cerrado | Sin transporte, sin shell |
Inferido de la misma concatenación, no demostrado: un tipo o contentId manipulado que incluya un boundary multipart podría dividir el mensaje en partes adicionales en un MUA receptor. No envié correo.
Restos del mismo pin: window SQLi, collate SQLi, cache unserialize.
Fijé cakephp/cakephp 5.4.2 tras la nota de la bakery de que la inyección en filename= de Content-Disposition multipart había sido corregida. _headerParameterToString es el saneador:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() todavía hace:
if ($this->type) {
$out .= 'Content-Type: ' . $this->type . "\r\n";
}
if ($this->contentId) {
$out .= 'Content-ID: <' . $this->contentId . ">\r\n";
}
Message::setAttachments copia el tipo de cliente de la subida sin eliminación. attachFiles / attachInlineFiles luego llaman a $part->type($fileInfo['mimetype']) y $part->contentId($fileInfo['contentId']).
Caminos equivocados ya registrados: tratar el RCPT del sobre como este resto (la línea extra está en el cuerpo); afirmar que filename= todavía inyecta (no lo hace); enviar SMTP; una reverse shell. Teatro.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
o
cd lab
./run.sh
Objetivo solo http://127.0.0.1:19460. PHP 8.3, CakePHP tag 5.4.2 clonado en el build. lab_server.php expone Message::setAttachments. Cuatro casos: control de filename, mimetype, contentId, tipo de medio de 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
Pasar type, contentId y transferEncoding por la misma eliminación de " / \r / \n que _headerParameterToString. Rechazar el valor si todavía contiene un salto de línea tras la eliminación. Cubrir el MIME de cliente de UploadedFile y mimetype / contentId explícitos en las pruebas del mailer, no solo filename=.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= en la bakery de 5.4.2GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.