
Mautic < 5.2.3 인증된 RCE
Asset 편집 기능에서 업로드된 파일의 콘텐츠, 유형 및 확장자에 대한 부적절한 검증으로 인해 인증된 공격자가 웹 디렉터리 내에 임의의 PHP 코드를 작성하고 해당 파일이 기록된 위치를 찾을 수 있습니다. 이로 인해 원격 코드 실행(RCE)이 발생합니다.
경로 순회(path traversal)를 통해 이 기능을 악용하여 웹 사용자가 수정 권한을 가진 파일 시스템의 모든 디렉터리를 재귀적으로 삭제할 수도 있습니다.

/assets/view/{assetID} 경로를 통해 Asset을 편집할 때 에셋의 파일을 변경할 수 있는 기능이 제공됩니다.
새 파일 업로드는 궁극적으로 app/Bundles/AssetBundle/Controller/AssetController.php 내부의 다음 함수를 호출합니다:
public function editAction(Request $request, UploaderHelper $uploaderHelper, AssetModel $model, $objectId, $ignorePost = false)
업로드 로직은 다음에서 확인할 수 있습니다:
if (!$ignorePost && 'POST' == $method) {
$valid = false;
if (!$cancelled = $this->isFormCancelled($form)) {
if ($valid = $this->isFormValid($form)) {
$entity->setUploadDir($this->coreParametersHelper->get('upload_dir'));
$entity->preUpload();
$entity->upload();
특히, 디스크에 실제 파일 쓰기를 처리하는 preUpload() 및 upload() 메서드에 관심이 있습니다. 첫 번째 결함은 app/Bundles/AssetBundle/Entity/Asset.php의 preUpload()에 있습니다. 구현상 임의의 파일 확장자를 지정할 수 있으므로(따라서 일반적으로 allowed_extensions 배열이 제공하는 보호를 우회할 수 있습니다):
$filename = sha1(uniqid(mt_rand(), true));
$extension = $this->getFile()->guessExtension();
if (empty($extension)) {
// get it from the original name
$extension = pathinfo($this->originalFileName, PATHINFO_EXTENSION);
}
$this->path = $filename.'.'.$extension;
$extension = $this->getFile()->guessExtension(); 줄은 .php로 끝나고 <?php 태그로 시작하는 콘텐츠를 제공하면 NULL을 반환합니다. 따라서 empty($extension) 검사가 true로 평가되고, 파일 확장자는 pathinfo() 호출을 통해 추출되므로 임의의 콘텐츠와 확장자를 가진 임시 파일을 업로드할 수 있습니다. 파일 이름은 sha1()로 생성되므로 실제 이름을 제어할 수 없습니다.
그런 다음 후속 upload() 메서드 내에서 파일은 다음 호출을 통해 웹 디렉터리의 디스크에 실제로 기록됩니다:
$this->getFile()->move($this->getUploadDir(), $this->path);
우리의 임의 확장자($this->path 변수에 포함됨)를 사용합니다. 그런 다음 Asset 세부 정보 페이지(/assets/view/{assetId})를 새로 고치면 Local filename 테이블 항목 아래에서 파일 이름을 확인할 수 있습니다.
참고: 새 Asset을 생성할 때 전송되는 요청을 변경해도 동일하게 작동합니다. 이 경우 newAction() 함수가 호출되지만 로직은 동일하며 결함은 여전히 preUpload() 및 upload() 메서드에 있습니다.
PoC는 앞으로 약 한 달 동안 공개되지 않습니다.
이는 이 소프트웨어에 의존하는 조직이 스크립트 키디들이 시스템을 망가뜨릴 걱정 없이 패치할 시간을 주기 위한 것입니다.
그 후 이 저장소는 전체 익스플로잇 스크립트와 증명으로 업데이트됩니다. 어차피 이 페이지에는 이미 충분한 정보가 있습니다.
임시 업로드를 검증할 때(/s/assets/new 또는 /s/assets/edit/{assetId} 통해), 임시 파일을 저장하는 디렉터리는 요청 종료 시 재귀적으로 삭제됩니다. 임시 디렉터리 이름을 보관하는 매개변수는 경로 순회 공격에 취약하여, 인증된 공격자가 웹 사용자에게 해당 권한이 있으면 시스템의 모든 디렉터리를 삭제할 수 있습니다. 이로 인해 데이터 손실이 발생하거나, 서버가 root 사용자로 실행되는 경우 전체 파일 시스템이 파괴될 수도 있습니다.
아래 사용된 엔드포인트를 통해 시스템에 존재하는 임의의 파일을 지정하세요. 파일이 존재하면 서버는 해당 파일이 저장된 디렉터리를 삭제하려 시도합니다.

서버 장악 서비스 거부 데이터 손실