
CakePHP 5.4.2 - 높음 - 원격 - CRLF - 첨부 파일 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 클라이언트 미디어 타입을 추가 필터 없이 해당 타입 필드에 복사합니다.
사용자 업로드를 첨부하거나 사용자의 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 헤더 줄 | 'mimetype' => "text/plain\\r\\nX-Injected: …"를 사용한 setAttachments | 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를 참조하십시오. 루프백 실험실 전용입니다. 보증하지 않습니다.