
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는 이미 멀티파트 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()만 호출 | 차단됨 | 트랜스포트 없음, 셸 없음 |
동일한 문자열 연결에서 추론되었으나 입증되지 않음: 멀티파트 경계를 포함하는 조작된 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를 노출한다. 네 가지 케이스: 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 참조. 루프백 랩 전용. 보증 없음.