Burp Suite로 멀티파트 파일 업로드 디버깅
Burp Suite를 통해 멀티파트 파일 업로드 요청을 분석하고 편집하는 절차와 핵심 포인트를 초보자도 이해하기 쉬운 예제로 정리한 자료
목차
개요
웹 애플리케이션에서 파일 업로드는 멀티파트 형식으로 전송된다. Burp Suite는 이 요청을 가로채고 분석·편집할 수 있어 취약점 발견과 디버깅에 유용하다. 이 글은 Burp 멀티파트 디버깅 과정의 기본 개념부터 구체적인 편집 절차, 흔한 문제와 해결법까지 초보자도 따라 할 수 있게 정리한다.
멀티파트 형식 이해
기본 구조
파일 업로드는 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary... 형태로 전송된다. 각 파트는 경계(boundary)로 구분되며 헤더와 본문으로 구성된다. 경계 문자열이 정확히 일치해야 서버가 각 파트를 올바르게 파싱한다.
예시 요청
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 138
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="description"
테스트 파일
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Hello world
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Burp에서 기본 설정
Proxy 가로채기
먼저 브라우저의 프록시를 Burp로 지정하고 Proxy → Intercept를 활성화한다. 파일 업로드 시점에 요청을 가로채면 Raw 탭에서 멀티파트 본문을 확인할 수 있다. 이 상태에서 바로 편집하거나 Repeater로 보낼 수 있다.
파일 업로드 흐름 제어
일부 앱은 자바스크립트로 폼을 변형하거나 토큰을 추가한다. Burp의 Proxy → Options에서 Match and Replace 규칙을 사용해 테스트 토큰을 고정하거나, Intruder 또는 Repeater로 파라미터를 반복 테스트할 수 있다.
실제 디버깅 절차
아래 절차는 Burp multipart 요청 편집의 핵심 흐름이다.
- 브라우저에서 업로드를 시도해 요청을 Burp Proxy가 가로채도록 한다.
- Intercepted Request를 Raw 모드로 확인한다. Content-Type과 boundary 값을 먼저 확인한다.
- 요청을 Repeater로 보낸다. Repeater에서 파트별로 헤더와 본문을 편집해 테스트한다.
- 경계 문자열(boundary)이 변경되면 Content-Type 헤더를 반드시 함께 수정한다.
- 파일 바이너리 내용을 바꿀 때는 Transfer-Encoding과 Content-Length를 재확인한다.
- 수정 후 Send로 서버 응답을 확인하고 필요 시 반복한다.
구체적 편집 예
파일명을 바꾸거나 파일 내용 일부를 변경해 서버의 필터를 우회해야 할 때가 있다. Repeater에서 본문을 직접 편집하면 된다. 예컨대 filename 파라미터만 변경하거나 content-type을 text/plain으로 강제하는 식이다.
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="exploit.php"
Content-Type: application/x-php
<?php echo 'ok'; ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW--
주의할 점과 문제 해결
Boundary 불일치
가장 흔한 오류는 본문의 경계 문자열과 Content-Type 헤더 경계가 다를 때 발생한다. 편집 후에는 두 위치가 일치하는지 항상 확인한다.
CRLF와 줄바꿈
멀티파트는 CRLF(\r\n)를 기준으로 파트를 구분한다. 줄바꿈을 LF(\n)만 사용하면 파싱 오류가 날 수 있다. Burp의 Raw 편집에서 줄바꿈을 변경하지 않도록 주의한다.
Content-Length와 Chunked
요청 본문을 편집하면 Content-Length가 달라진다. 일반적으로 Burp는 자동으로 Content-Length를 재계산하지만, 수동으로 편집한 경우 값이 틀릴 수 있으니 확인한다. Transfer-Encoding: chunked인 경우에도 서버 처리 방식을 이해해야 한다.
파일 시그니처 검증
서버는 파일 확장자뿐 아니라 매직 넘버로 파일 타입을 검증한다. 텍스트로 확장자를 바꿔도 시그니처가 남아 있다면 차단될 수 있다. 이 경우 파일 내용을 적절히 변형해야 한다.
실습 예: curl로 재현 후 Burp에서 편집
로컬에서 먼저 curl로 요청을 만들어 테스트할 수 있다. 그런 다음 브라우저 대신 curl에 Burp를 프록시로 지정하면 요청을 Burp에서 가로챌 수 있다.
curl -x http://127.0.0.1:8080 -F "description=테스트" -F "file=@test.txt" http://example.com/upload
이 요청을 Burp가 가로채면 Raw 탭에서 본문을 확인한 뒤 Repeater로 보내 편집한다. filename, Content-Type, 내부 본문을 바꿔 서버 반응을 관찰하면서 Burp 멀티파트 디버깅을 반복한다.
팁: 자동화와 검사 확장
많은 반복 테스트가 필요한 경우 Intruder를 사용해 파일명이나 파라미터를 자동화할 수 있다. 또한 Matcher, Macro 기능을 조합해 인증 토큰을 자동으로 갱신하는 워크플로를 만들면 더 효율적으로 테스트할 수 있다.
마무리
Burp multipart 요청 편집은 경계 문자열, 줄바꿈, Content-Length 같은 세부 규칙을 이해하면 어렵지 않다. 단계적으로 요청을 가로채고 Repeater에서 수정한 뒤 서버 반응을 확인하는 흐름을 반복하면 문제 원인을 빠르게 찾아낼 수 있다. 이 과정을 통해 파일 업로드 취약점 발견과 방어 로직 검증이 가능하다.