
CakePHP 5.4.2 - 高 - リモート - CRLF - attachment 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 はすでにマルチパートの 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 を参照。ループバックラボのみ。無保証。