현재 위치: > 최신 기사 목록> 이미지 _type_to_extension ()이 사용될 때 파일 형식을 확인하지 않으면 어떤 문제가 발생합니까? 위험은 무엇입니까?

이미지 _type_to_extension ()이 사용될 때 파일 형식을 확인하지 않으면 어떤 문제가 발생합니까? 위험은 무엇입니까?

M66 2025-06-23

파일 형식을 확인하지 않을 위험

1. 단조 파일 유형 우회 업로드 확인

공격자는 이미지로 가장면으로 악의적 인 스크립트 (예 : 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를 방문하여 악성 코드를 실행할 수 있습니다.

2. exif_imagetype () 가 실패하고 거짓을 반환하지만 여전히 image_type_to_extension () 에서 전달됩니다.

exif_imagetype () 가 파일 유형을 인식하지 못하면 false를 반환합니다. 결과가 여전히 image_type_to_extension () 에 전달되면,이 시점에서 .int (0)이 반환되어 생성 된 파일 이름과 논리적 예외가 혼란을 초래합니다. 예를 들어:

 $type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// 만약에$type~을 위한false,$ext~을 위한"."

이로 인해 프로그램이 잘못된 파일 확장을 사용하고 후속 작업에 영향을 미치며 자원 누출을 유발할 수 있습니다.

3. FileInfo 또는 EXIF ​​확장이 활성화되지 않았습니다

일부 서버 환경에서는 PHP가 fileInfo 또는 exif 확장자를 활성화하지 않으면 exif_imagetype ()가 실패합니다. 여전히 결과에 의존하고 Image_Type_to_extension ()을 통과하는 경우, 프로그램은 논리적 오류를 충돌 시키거나 처리하기 쉽고 사용자 경험에 영향을 미칩니다.

4. 확장에 의존하는 보안 정책은 유효하지 않습니다

일부 서비스 배포 보안 정책은 .jpg.png 파일과 같은 확장에 따라 제한됩니다. 공격자가 파일 이름을 위조하고 백엔드 확인을 우회 한 경우 서버가 액세스를 잘못 부여 할 수 있습니다.

예를 들어 .php.jpg 라는 파일이 업로드되었지만 실제 형식은 PHP입니다. Nginx는 특정 구성 하에서 .php 파일로 실행되므로 심각한 결과를 초래합니다.

 <?php echo shell_exec($_GET['cmd']); ?>

그런 다음 액세스 : :

 http://m66.net/uploads/backdoor.php.jpg?cmd=ls

서버를 원격으로 제어 할 수 있습니다.


그것을 사용하는 올바른 방법

위의 위험을 피하기 위해 다음 조치를 취해야합니다.

  1. exif_imagetype ()를 사용하고 반환 값이 False인지 확인하십시오.

  2. Finfo_file ()을 사용하여 MIME 유형을 추가로 확인하십시오

  3. 제한된 업로드 디렉토리가 실행 가능하지 않습니다

  4. 사용자 제출 확장을 신뢰하지 마십시오

  5. 화이트리스트를 사용하여 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);