File upload - Null byte

강혜인·2025년 5월 29일

WEB_Hack

목록 보기
15/18

Null Byte Injection


Null Byte Injection?

  • 웹 애플리케이션에서 파일 업로드와 같은 입력 처리를 악용하기 위해 사용되는 공격 기법 중 하나
  • 프로그래밍 언어나 라이브러리가 문자열을 처리할 때, 문자열의 끝을 나타내는 특수 문자 \0(널 바이트로 인해 발생하는 취약점

Null Byte?

  • C언어와 같은 저수준 프로그래밍 언어에서 문자열의 끝을 나타내는 특수 문자
  • 문자열의 끝을 만났음을 표시하는 이 문자는 문자열 처리를 담당하는 함수들이 더 이상 데이터를 읽지 않도록 만듦

Null Byte Injection의 원리


Null Byte Injection은 문자열 기반 처리를 사용하는 프로그램이 입력 데이터를 처리하는 과정에서 \0 문자를 만나면 그 이후의 데이터를 무시하도록 만드는 방식으로 작동

파일 업로드 예시

  • 사용자가 malicious.php%00.jpg 라는 파일을 업로드한다.
  • 백엔드 코드가 이 파일 이름을 검증할 때, jpg 확장자를 확인해 이미지 파일로 허용한다.
  • 그러나 실제로 서버의 특정함수(예 : 파일 시스템 함수)가 이를 처리하면서 %00(널 바이트)을 만나 malicious.php로만 인식하게 된다.

코드의 취약점

  • 개발자가 파일 확장자를 확인하기 위해 문자열 끝을 검사하는 로직을 구현했다면, 널 바이트 이후의 내용은 무시되어 우회 가능하게 된다.
  • strpos()와 같은 함수는 널 바이트 이후 문자열을 처리하지 않으므로 검증에 실패할 수 있다.

Null Byte Injection의 사용 사례


악성 파일 업로드

  • 공격자가 .php 와 같은 실행 가능한 스크립트를 .jpg 처럼 보이도록 위창해 업로드 할 수 있다.
  • 예 : payload.php%00.jpg
  • 서버가 파일 확장자를 기반으로 허용 여부를 결정한다면, 널 바이트 이후의 내용을 무시하여 PHP 파일이 실행될 수 있다.

디렉터리 탐색 및 우회

  • 파일 경로나 이름에서 널 바이트를 삽입해 경로 확인 로직을 우회할 수 있다.
  • 예 : ../../../etc/passwd%00.jpg

데이터 베이스 쿼리 우회

  • SQL이나 다른 문자열 기반 입력 처리에서 널 바이트를 삽입해 의도하지 않은 결과를 얻을 수 있다.

Null Byte Injection이 발생하는 환경


C기반 라이브러리

  • PHP, Python 등 고수준 언어에서도 여전히 C 라이브러리를 사용하기 때문에 널 바이트 취약점이 존재할 수 있다.
  • PHP의 오래된 버전에서는 file_exists()와 같은 함수가 Null Byte Injection에 취약했다.

파일 시스템

  • 파일 업로드 처리 시, 파일 이름을 조작해 공격자가 널 바이트 이후의 내용을 제거할 수 있다.

부적절한 입력 검증

  • 서버에서 파일 이름이나 확장자를 제대로 검증하지 않거나 널 바이트 문자를 허용하는 경우 취약점이 발생할 수 있다.

Null Byte Injection 방어 방법


널 바이트 문자 제거

  • 사용자 입력을 처리하기 전에 \0 문자를 제거한다.
$filename = str_replace("\0", "", $filename);

파일 업로드 처리 강화

  • 파일 확장자를 확인하는 것만으로 보안을 보장하지 않는다.
  • MIME 타입 검증
    • 파일 내용을 분석해 MIME 타입을 검증한다.
    • PHP에서는 mime_content_type()이나 finfo 확장 기능을 사용할 수 있다.
  • 허용된 파일 확장자만 처리
    • 화이트리스트 방식을 사용해 허용된 확장자만 수용한다.
    ```php
    $allowed_extenstions = ['jpg', 'png', 'gif'];
    $file_extension = pathinfo($filename, PATHINFO_EXTENSION);
    if(!in_array($file_extension, $allowed_extension)){
    	die("Invalid file type.");
    }
    ```
    

파일 저장 위치를 안전하게 설정

  • 업로드된 파일은 서버의 실행 가능한 디렉터리에 저장하지 않는다.
  • 실행 권한이 없는 별도의 디렉터리를 설정한다.

최신 라이브러리와 프레임워크 사용

  • Null Byte Injection 취약점은 최신 PHP 버전에서는 대부분 수정되었다.
  • 항상 최신 버전의 소프트웨어와 라이브러리를 사용한다.

Null Byte Injection의 테스트 방법


웹 애플리케이션 테스트

  • 파일 업로드 기능에 다음과 같은 페이로드를 삽입해 본다.
    • test.php%00.jpg
    • ../../etc/passwd%00.txt

문자열 입력 테스트

  • 널 바이트를 포함한 입력을 제공해 서버의 동작을 관찰한다.
curl -X POST -F "file=@malicious.php%00.jpg" http://example.com/upload

Null Byte Injection과 관련된 실제 사례


PHP 5.x Null Byte 취약점

  • PHP 5.x 버전에서는 파일 처리 함수(예 : file_exists, fopen)가 Null Byte Injection에 취약해 악성 파일 실행이 가능했다.

CVE-2006-7243

  • 특정 PHP 버전에서 파일 업로드 취약점이 발견되었으며, 이를 통해 널 바이트 인젝션이 발생할 수 있었다.

CVE -
CVE-2006-7243

0개의 댓글