1. 널 바이트 인젝션(Null Byte Injection) 이란?
1.1 개념
- 널 바이트 인젝션(Null Byte Injection)은 널 바이트(\x00)를 이용해 문자열 처리를 조작하는 공격 기법이다.
- 널 바이트는 C 언어에서 문자열의 끝(Null Terminator) 으로 처리되므로, 이후의 데이터가 무시될 수 있다.
- 이러한 특성을 악용하여 입력값 검증을 우회하고, 권한 상승, 파일 업로드 우회, 계정 탈취 등의 공격을 수행할 수 있다.
1.2 널 바이트가 발생하는 이유
- 널 바이트(\x00)는 C 및 일부 저수준 프로그래밍 언어에서 문자열 종료를 의미한다.
- 그러나, Python, Java, Go 등의 최신 언어는 문자열의 길이를 따로 관리하기 때문에 널 바이트가 포함되더라도 데이터가 잘리지 않는다.
- 이와 같은 언어 및 라이브러리 간의 문자열 처리 차이를 악용하면, 특정 웹 애플리케이션 및 데이터베이스에서 보안 취약점이 발생할 수 있다.
2. 널 바이트 취약점이 발생하는 원리
2.1 C 언어 기반 문자열 처리 특성
- C 언어에서는 문자열이 널 바이트(\x00)를 만나면 그 이후 데이터를 무시하는 특징이 있다.
🔍 예제 코드 (C 언어)
#include <stdio.h>
int main() {
char username[] = "admin\x00haxasdfasdf";
printf("%s", username);
return 0;
}
✅ 출력 결과: admin
✅ 널 바이트 이후 문자열은 무시됨!
2.2 SQLite의 문자열 처리 방식
- SQLite는 C 기반으로 작성된 데이터베이스이므로, 널 바이트 이후의 문자열을 무시한다.
- 즉, admin\x00hax로 가입해도 DB에는 "admin"으로 저장될 수 있다.
🔍 SQLite에서 발생하는 문제 예제
INSERT INTO users (username, password) VALUES ('admin\x00hax', 'password123');
✅ SQLite 내부 저장 값
| username | password |
|----------|--------------|
| admin | password123 |
✅ 기존 admin 계정과 동일하게 인식됨.
2.3 기타 활용 분야
- 파일 업로드 우회, Path Traversal, 세션 및 인증 토큰 변조 등에도 사용될 수 있다.
3. 방어 방법
3.1 사용자 입력값 검증 및 필터링
- 널 바이트(\\x00, %00, \\u0000 등)를 포함한 제어 문자(Control Characters) 를 차단하거나 안전한 방식으로 변환해야 한다.
3.2 화이트리스트(Whitelist) 적용
- 파일 업로드 시 .php, .exe 등의 위험한 확장자를 필터링하는 것이 아니라,.jpg, .png 등의 허용할 확장자만 지정하는 것이 더 안전함.
3.3 SQLite 및 데이터베이스 보안 강화
- 널 바이트 인젝션은 SQL Injection과 결합될 가능성이 크기 때문에 DB 보안이 중요하다.
3.3.1 SQL 쿼리에서 HEX 비교 사용
- SQLite 및 MySQL에서 널 바이트를 포함한 문자열 비교를 정확하게 수행하기 위해 HEX() 변환을 적용해야 한다.
3.3.2 Prepared Statement (매개변수 바인딩) 적용
- SQL Injection 및 널 바이트 공격을 방어하려면 Prepared Statement를 사용해야 한다.
3.4 파일 업로드 및 경로 탐색 공격 방어
- 파일 시스템 관련 취약점(업로드 우회, 경로 탐색 등)은 널 바이트 공격의 주요 대상이다.
3.4.1 파일 업로드 시 MIME 타입 검증
3.4.2 경로 탐색(Path Traversal) 방어
3.5 WAF(Web Application Firewall) 및 보안 모니터링
- 웹 애플리케이션 방화벽(WAF)을 사용하여 널 바이트 공격을 사전에 탐지하고 차단할 수 있다.
참고 자료
https://owin2828.github.io/devlog/2020/01/09/etc-2.html?
https://www.thehacker.recipes/web/inputs/null-byte-injection
'Hack&Dev > Web' 카테고리의 다른 글
Flask 디버그 모드에서의 LFI(Local File Inclusion) 및 PIN 탈취 취약점 (0) | 2025.02.22 |
---|---|
TXT 레코드란? (0) | 2025.02.15 |
sitemap.xml 이란? (0) | 2025.02.15 |
스왑 파일(Swap File)이란? (0) | 2025.02.15 |
HTML 엔티티(HTML Entities)란? (XSS 방지) (2) | 2025.02.14 |