Burp로 파일 업로드 무결성 및 확장자 우회
Burp Suite를 활용한 파일 업로드 무결성 검사와 확장자 우회 테스트 절차, 주요 기법과 예제, 로그 분석 및 대응 방안을 정리한 기술자료
목차
개요
웹 애플리케이션에서 파일 업로드 기능은 공격 표면이 큰 영역이다. 무결성 검사나 확장자 필터가 있어도 우회가 가능하다. 본문은 Burp Suite를 이용해 업로드 무결성 검사와 확장자 필회 우회 기법을 단계별로 설명한다. 처음 접하는 사람도 따라할 수 있도록 흐름과 예제를 중심으로 정리한다.
목표
테스트 목적
업로드 필터의 검증 방식(확장자 검사, MIME 검사, 콘텐츠 기반 검사 등)을 파악한다. 무결성 검사(파일 해시, 크기 체크 등)를 우회하거나 회피하는 방법을 실습한다. 로그와 서버 반응을 분석해 탐지 포인트를 찾는다.
준비물과 기본 개념
필수 도구
- Burp Suite (Proxy, Repeater, Intruder 사용)
- 간단한 텍스트 편집기
- 파일 변조용 도구(hexdump, 바이너리 편집기)
무결성 검사와 우회 핵심
무결성 검사는 보통 파일의 해시나 크기, 내부 시그니처(파일 헤더)로 구현된다. 우회는 검사 순서와 검증 위치를 이해하면 가능하다. 예를 들어 클라이언트에서 해시를 생성해 전송하면 중간 조작이 쉬우므로 서버 측 검증 여부가 중요하다.
Burp 흐름 개요
기본 흐름은 다음과 같다.
- 업로드 요청을 Burp Proxy로 캡처
- Repeater로 동일 요청 재전송 및 파라미터 변조
- 확장자나 헤더를 변경하며 서버 반응 관찰
- 필요 시 Intruder로 페이로드 자동화
테스트 절차
1. 업로드 요청 캡처
업로드 동작을 브라우저에서 실행하고 Burp Proxy에서 multipart 요청을 캡처한다. 요청 구조를 파악하면 어떤 필드가 파일 데이터를 담는지 확인할 수 있다.
2. 기본 무결성 검사 우회 시도
서버가 파일 해시를 함께 받는지 확인한다. 클라이언트에서 보내는 해시가 있다면 값을 변경하거나 제거해 서버 반응을 확인한다. 서버가 해시를 무시하면 무결성 검사가 구현되어 있지 않다는 신호다.
3. 확장자 우회 기법 목록
- 파일명 변형: shell.php.jpg, webshell.php;.jpg
- 이중 확장자: image.php.png
- Content-Type 위조: image/jpeg로 설정
- 파일 헤더 변조: magic bytes를 이미지로 변경
- NULL 바이트 삽입(서버가 오래된 파서 사용 시): shell.php%00.jpg
- 경로 변수 조작: 업로드 후 접근 경로를 추측해 직접 실행
4. 파일 내용 변조와 해시 검사
파일 내부를 변경해도 확장자가 허용되면 업로드될 수 있다. 서버가 업로드 후 내부 검사를 한다면 바이너리 수정으로 이미지 헤더를 유지하면서 내부에 페이로드를 숨겨야 한다. 해시 검증이 있다면 해시를 재계산해 요청을 재전송해본다.
실습 예제: multipart 요청 수정
아래는 일반적인 multipart/form-data 업로드 예시다. Burp에서 캡처한 후 Repeater로 값을 수정한다.
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundary--
위 요청에서 다음을 시도한다.
- filename을 "shell.php.jpg"로 변경
- Content-Type을 "image/jpeg"로 변경
- 파일 내부 시작을 JPEG magic bytes로 바꾼 뒤 실제 페이로드는 주석으로 삽입
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.php.jpg"
Content-Type: image/jpeg
FFD8FFE0 0001044A 46494600 01010001 00010000 /* JPEG header */
<?php phpinfo(); ?>
------WebKitFormBoundary--
Burp Repeater로 위 변형을 반복 전송하며 서버 응답을 확인한다. 업로드 후 반환되는 URL, 상태 코드, 오류 메시지 등을 기록한다.
로그 분석과 탐지 포인트
서버 로그와 WAF 로그에서 다음을 확인한다.
- 업로드된 파일의 실제 MIME 유형 식별 결과
- 파일 확장명과 실제 Content-Type 불일치 경고
- 업로드 후 파일 처리 모듈의 에러 메시지
이 정보는 어떤 검증이 서버 측에서 실행되는지 파악하는 데 중요하다.
대응 방안 요약
- 서버 측에서 파일 확장자뿐 아니라 콘텐츠 기반(magic bytes) 검증을 실행
- 업로드된 파일은 실행 권한을 주지 않고 별도 저장소에 보관
- 파일명은 서버에서 무작위로 재명명하고 접근 경로를 제어
- 허용된 파일 형식 목록을 최소화하고 화이트리스트 방식 적용
결론
Burp Suite는 파일 업로드 유효성 검사를 탐색하고 우회 방법을 검증하는 데 유용하다. 핵심은 클라이언트-서버 간 검증 위치와 검증 내용을 정확히 파악하는 것이다. 제시한 절차와 예제를 통해 업로드 보안 취약점을 체계적으로 점검할 수 있다.