
CakePHP 5.4.2 — высокий — удалённый — CRLF — вложение Content-Type и остаток Content-ID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
Класс: инъекция заголовков MIME-части Доступ: удалённый
CakePHP 5.4.2 (887b641) — Cake Software Foundation
5.4.2 уже удаляет ", \r и \n из multipart name= / filename= (FormDataPart::_headerParameterToString). Это контроль. Content-Type и Content-ID остались как сырая конкатенация. Message::setAttachments копирует клиентский media type из UploadedFile в это поле типа без дополнительной фильтрации.
Приложение, которое прикрепляет пользовательскую загрузку или передаёт пользовательский contentId, помещает эти байты в MIME-часть. getBodyString() затем показывает вторую строку заголовка под этой частью.
| ID | CVE пока нет |
| Класс | инъекция заголовков MIME-части |
| Доступ | удалённый (приложение, которое прикрепляет пользовательскую загрузку или пользовательский contentId) |
| CWE | CWE-93 |
| CVSS | Средний: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N |
| Продукт | CakePHP |
| Затронуто | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Аутентификация | приложение, которое прикрепляет пользовательскую загрузку (клиентский MIME из UploadedFile) или пользовательский contentId |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Тот, кто может влиять на метаданные вложения, которые приложение передаёт в Message::setAttachments / addAttachment, может внедрять заголовки MIME-части.
| Привилегия | Метод / sink | Тип | Доказано в лаборатории или выведено |
|---|---|---|---|
Дополнительная строка заголовка Content-Type | setAttachments с 'mimetype' => "text/plain\\r\\nX-Injected: …" | Целостность заголовков MIME-части | Доказано в лаборатории. Строка-свидетель присутствует |
Дополнительная строка заголовка Content-ID | 'contentId' => "cid@…>\\r\\nX-Injected: …" (inline-часть) | Целостность заголовков MIME-части | Доказано в лаборатории. Строка-свидетель присутствует |
| Та же инъекция через MIME загрузки | UploadedFile::getClientMediaType() копируется в mimetype | Целостность заголовков MIME-части | Доказано в лаборатории. Строка-свидетель присутствует |
CRLF в filename= | имя вложения с CR/LF | Закрыто | Доказано в лаборатории, что закрыто. Удаление в 5.4.2 работает |
RCPT конверта / Bcc через этот sink | заголовки MIME-части в теле | Закрыто | Это удаление только для пары в SmtpTransport, родственная проблема |
| Отправка SMTP | лаборатория вызывает только getBodyString() | Закрыто | Нет транспорта, нет shell |
Выведено из той же конкатенации, но не продемонстрировано: специально сформированный type или contentId, включающий multipart boundary, мог бы разбить сообщение на дополнительные части в принимающем MUA. Я не отправлял почту.
Остатки того же пина: window SQLi, collate SQLi, cache unserialize.
Я зафиксировал cakephp/cakephp 5.4.2 после заметки bakery о том, что инъекция в multipart Content-Disposition filename= исправлена. _headerParameterToString — это санитайзер:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() по-прежнему делает:
if ($this->type) {
$out .= 'Content-Type: ' . $this->type . "\r\n";
}
if ($this->contentId) {
$out .= 'Content-ID: <' . $this->contentId . ">\r\n";
}
Message::setAttachments копирует клиентский тип загрузки без удаления. attachFiles / attachInlineFiles затем вызывают $part->type($fileInfo['mimetype']) и $part->contentId($fileInfo['contentId']).
Уже зафиксированные ошибочные пути: трактовка конверта RCPT как этого остатка (дополнительная строка находится в теле); утверждение, что filename= всё ещё инжектируется (это не так); отправка SMTP; reverse shell. Театр.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
или
cd lab
./run.sh
Цель только http://127.0.0.1:19460. PHP 8.3, тег CakePHP 5.4.2 клонируется при сборке. lab_server.php предоставляет Message::setAttachments. Четыре случая: контроль filename, mimetype, contentId, media type из 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
Пропустите type, contentId и transferEncoding через то же удаление " / \r / \n, что и _headerParameterToString. Отклоняйте значение, если после удаления оно всё ещё содержит перевод строки. Покройте клиентский MIME из UploadedFile и явные mimetype / contentId в тестах mailer, а не только filename=.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= в bakery 5.4.2GNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.