abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
类别: MIME 部件头部注入 可达性: 远程
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.4.2 已经从 multipart 的 name= / filename= 中剥离了 "、\r 和 \n(FormDataPart::_headerParameterToString)。这是对照组。Content-Type 和 Content-ID 则被保留为原始拼接。Message::setAttachments 将 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) |
| 认证 | 附加用户上传文件(UploadedFile 客户端 MIME)或用户 contentId 的应用 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
能够影响应用传入 Message::setAttachments / addAttachment 的附件元数据的人,可以注入 MIME 部件头部。
| 权限 | 方法 / 汇聚点 | 类型 | 实验验证或推断 |
|---|---|---|---|
额外的 Content-Type 头部行 | setAttachments 配合 'mimetype' => "text/plain\\r\\nX-Injected: …" | MIME 部件头部完整性 | 实验验证。见证行存在 |
额外的 Content-ID 头部行 | 'contentId' => "cid@…>\\r\\nX-Injected: …"(内联部件) | MIME 部件头部完整性 | 实验验证。见证行存在 |
| 通过上传 MIME 的相同注入 | UploadedFile::getClientMediaType() 被复制到 mimetype | MIME 部件头部完整性 | 实验验证。见证行存在 |
filename= CRLF | 带 CR/LF 的附件名 | 已关闭 | 实验验证已关闭。5.4.2 的剥离有效 |
通过此汇聚点的信封 RCPT / Bcc | 正文中的 MIME 部件头部 | 已关闭 | 那是 SmtpTransport 仅针对配对的剥离,属于同类问题 |
| SMTP 发送 | 实验仅调用 getBodyString() | 已关闭 | 无传输,无 shell |
从相同拼接推断,但未演示:一个精心构造的 type 或 contentId 若包含 multipart 边界,可能在接收方 MUA 中将消息拆分为额外的部件。我没有发送邮件。
同一版本遗留问题:window SQLi、collate SQLi、cache unserialize。
在 bakery 说明 multipart Content-Disposition filename= 注入已修复后,我锁定了 cakephp/cakephp 5.4.2。_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;反弹 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、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 通过 _headerParameterToString 相同的 " / \r / \n 剥离处理。如果剥离后值仍包含换行符,则拒绝该值。在邮件测试中覆盖 UploadedFile 客户端 MIME 以及显式的 mimetype / contentId,而不仅仅是 filename=。
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= 剥离GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。