Null Byte Injection?
- 웹 애플리케이션에서 파일 업로드와 같은 입력 처리를 악용하기 위해 사용되는 공격 기법 중 하나
- 프로그래밍 언어나 라이브러리가 문자열을 처리할 때, 문자열의 끝을 나타내는 특수 문자 \0(널 바이트로 인해 발생하는 취약점
Null Byte?
- C언어와 같은 저수준 프로그래밍 언어에서 문자열의 끝을 나타내는 특수 문자
- 문자열의 끝을 만났음을 표시하는 이 문자는 문자열 처리를 담당하는 함수들이 더 이상 데이터를 읽지 않도록 만듦
Null Byte Injection은 문자열 기반 처리를 사용하는 프로그램이 입력 데이터를 처리하는 과정에서 \0 문자를 만나면 그 이후의 데이터를 무시하도록 만드는 방식으로 작동
파일 업로드 예시
- 사용자가 malicious.php%00.jpg 라는 파일을 업로드한다.
- 백엔드 코드가 이 파일 이름을 검증할 때, jpg 확장자를 확인해 이미지 파일로 허용한다.
- 그러나 실제로 서버의 특정함수(예 : 파일 시스템 함수)가 이를 처리하면서 %00(널 바이트)을 만나 malicious.php로만 인식하게 된다.
코드의 취약점
- 개발자가 파일 확장자를 확인하기 위해 문자열 끝을 검사하는 로직을 구현했다면, 널 바이트 이후의 내용은 무시되어 우회 가능하게 된다.
- strpos()와 같은 함수는 널 바이트 이후 문자열을 처리하지 않으므로 검증에 실패할 수 있다.
악성 파일 업로드
- 공격자가 .php 와 같은 실행 가능한 스크립트를 .jpg 처럼 보이도록 위창해 업로드 할 수 있다.
- 예 : payload.php%00.jpg
- 서버가 파일 확장자를 기반으로 허용 여부를 결정한다면, 널 바이트 이후의 내용을 무시하여 PHP 파일이 실행될 수 있다.
디렉터리 탐색 및 우회
- 파일 경로나 이름에서 널 바이트를 삽입해 경로 확인 로직을 우회할 수 있다.
- 예 : ../../../etc/passwd%00.jpg
데이터 베이스 쿼리 우회
- SQL이나 다른 문자열 기반 입력 처리에서 널 바이트를 삽입해 의도하지 않은 결과를 얻을 수 있다.
C기반 라이브러리
- PHP, Python 등 고수준 언어에서도 여전히 C 라이브러리를 사용하기 때문에 널 바이트 취약점이 존재할 수 있다.
- PHP의 오래된 버전에서는 file_exists()와 같은 함수가 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 버전에서는 대부분 수정되었다.
- 항상 최신 버전의 소프트웨어와 라이브러리를 사용한다.
웹 애플리케이션 테스트
- 파일 업로드 기능에 다음과 같은 페이로드를 삽입해 본다.
- test.php%00.jpg
- ../../etc/passwd%00.txt
문자열 입력 테스트
- 널 바이트를 포함한 입력을 제공해 서버의 동작을 관찰한다.
curl -X POST -F "file=@malicious.php%00.jpg" http://example.com/upload
PHP 5.x Null Byte 취약점
- PHP 5.x 버전에서는 파일 처리 함수(예 : file_exists, fopen)가 Null Byte Injection에 취약해 악성 파일 실행이 가능했다.
CVE-2006-7243
- 특정 PHP 버전에서 파일 업로드 취약점이 발견되었으며, 이를 통해 널 바이트 인젝션이 발생할 수 있었다.