
CakePHP 5.4.2 - 高 - リモート - CRLF - attachment Content-Type および Content-ID の残存
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
解説記事: https://abraxaslabs.tech/research/cakephp-attachment-crlf
分類: MIMEパートヘッダインジェクション 到達範囲: リモート
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.4.2 はすでにマルチパートの name= / filename= から "、\r、\n を除去している(FormDataPart::_headerParameterToString)。これが対照群である。Content-Type と Content-ID は生の連結のまま残されていた。Message::setAttachments は UploadedFile のクライアントメディアタイプを追加のフィルタなしでその type フィールドにコピーする。
ユーザーのアップロードを添付するアプリ、またはユーザーの contentId を渡すアプリは、それらのバイト列を MIME パート上に載せてしまう。その後 getBodyString() はそのパートの下に2行目のヘッダ行を表示する。
| ID | CVE 未割当 |
| 分類 | MIMEパートヘッダインジェクション |
| 到達範囲 | リモート(ユーザーのアップロードまたはユーザーの contentId を添付するアプリ) |
| 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 |
| 製品 | 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() のみを呼び出す | 修正済み | トランスポートなし、シェルなし |
同じ連結処理から推測されるが実証はしていない: マルチパート境界を含む細工された type や contentId により、受信側 MUA でメッセージが追加パートに分割される可能性がある。メールの送信は行っていない。
同じピン留めからの残存項目: window SQLi、collate SQLi、cache unserialize。
マルチパート Content-Disposition の filename= インジェクションが修正されたという bakery の注記を受け、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 を送信すること;リバースシェル。すべて見せかけです。
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 を公開。4つのケース: 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 除去処理に通します。除去後も改行が残っている場合はその値を拒否します。メーラーのテストでは filename= だけでなく、UploadedFile のクライアント MIME と明示的な mimetype / contentId もカバーします。
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= 除去GNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。