공격자는 이미지로 가장면으로 악의적 인 스크립트 (예 : PHP 코드)를 업로드 할 수 있습니다. 예를 들어, PHP 백도어 .jpg 또는 .png가 포함 된 스크립트의 이름을 지정하여 업로드하십시오. exif_imagetype ()를 사용하여 실제 파일 유형을 감지하지 않으면 Image_Type_to_extension () 은 법적 확장을 실수로 반환하고, 후속 논리를 오도하고, 실행 디렉토리에 저장할 수 있습니다.
$filename = $_FILES['image']['tmp_name'];
$ext = image_type_to_extension(@exif_imagetype($filename));
// 잘못된 사용:탐지가 없습니다exif_imagetype반환 값입니다false
$newName = uniqid() . $ext;
move_uploaded_file($filename, "/var/www/html/uploads/" . $newName);
업로드 된 파일이 가짜 PHP 스크립트와 같은 실제 이미지가 아니지만 확장자는 .jpg 인 경우 공격자는 http://m66.net/uploads/xxxx.jpg를 방문하여 악성 코드를 실행할 수 있습니다.
exif_imagetype () 가 파일 유형을 인식하지 못하면 false를 반환합니다. 결과가 여전히 image_type_to_extension () 에 전달되면,이 시점에서 .int (0)이 반환되어 생성 된 파일 이름과 논리적 예외가 혼란을 초래합니다. 예를 들어:
$type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// 만약에$type~을 위한false,$ext~을 위한"."
이로 인해 프로그램이 잘못된 파일 확장을 사용하고 후속 작업에 영향을 미치며 자원 누출을 유발할 수 있습니다.
일부 서버 환경에서는 PHP가 fileInfo 또는 exif 확장자를 활성화하지 않으면 exif_imagetype ()가 실패합니다. 여전히 결과에 의존하고 Image_Type_to_extension ()을 통과하는 경우, 프로그램은 논리적 오류를 충돌 시키거나 처리하기 쉽고 사용자 경험에 영향을 미칩니다.
일부 서비스 배포 보안 정책은 .jpg 및 .png 파일과 같은 확장에 따라 제한됩니다. 공격자가 파일 이름을 위조하고 백엔드 확인을 우회 한 경우 서버가 액세스를 잘못 부여 할 수 있습니다.
예를 들어 .php.jpg 라는 파일이 업로드되었지만 실제 형식은 PHP입니다. Nginx는 특정 구성 하에서 .php 파일로 실행되므로 심각한 결과를 초래합니다.
<?php echo shell_exec($_GET['cmd']); ?>
그런 다음 액세스 : :
http://m66.net/uploads/backdoor.php.jpg?cmd=ls
서버를 원격으로 제어 할 수 있습니다.
위의 위험을 피하기 위해 다음 조치를 취해야합니다.
exif_imagetype ()를 사용하고 반환 값이 False인지 확인하십시오.
Finfo_file ()을 사용하여 MIME 유형을 추가로 확인하십시오
제한된 업로드 디렉토리가 실행 가능하지 않습니다
사용자 제출 확장을 신뢰하지 마십시오
화이트리스트를 사용하여 image_type_to_extension () 의 반환 값을 확인하십시오
샘플 코드 :
$filename = $_FILES['image']['tmp_name'];
$imageType = @exif_imagetype($filename);
if ($imageType === false) {
die('지원되지 않는 이미지 형식');
}
$ext = image_type_to_extension($imageType, false);
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($ext, $allowed)) {
die('이미지 유형이 허용되지 않습니다');
}
$newName = uniqid() . '.' . $ext;
move_uploaded_file($filename, '/var/www/uploads/' . $newName);