🎭 클릭재킹(UI Redressing) 시뮬레이터 Burp 005009a0 · Clickjacking

응답에 X-Frame-Options/CSP frame-ancestors가 없으면 임의 사이트가 내 페이지를 투명 iframe으로 감싸 사용자의 클릭을 납치합니다. 스캐너는 프레임 가능 응답 헤더만으로 이를 탐지합니다.

① 취약한 엔드포인트 (수동 탐침) VULNERABLE

공격자 페이지가 은행 송금 버튼 위에 투명 레이어를 얹고, 사용자에게는 '상품 받기' 버튼만 보여줍니다. 아래 시연에서 사용자가 누른 클릭이 실제로는 어디로 가는지 확인해 보세요.

🔬 실전 스캐너 - Burp Suite 기법 적용

아래 스캐너는 실제 Burp Suite Pro가 사용하는 페이로드 전량을 이 페이지 안의 가상 타겟에 대입해 스캔합니다. 방어를 켜고 다시 스캔하면 같은 페이로드가 전부 차단되는 것을 확인할 수 있습니다. (모든 요청은 브라우저 안에서만 처리 - 실제 네트워크 전송 없음)

② 취약 vs 안전 코드

VULNERABLE
// 방어 헤더 없는 응답 (Spring 필터 미적용)
@GetMapping("/transfer")
public String transfer(Model m){
    // 🚨 X-Frame-Options / CSP frame-ancestors 미설정
    // → 임의 출처의 <iframe src="https://bank.example/transfer">
    //    가 이 페이지를 감쌀 수 있음
    return "transfer";
}
SECURE
// 전 응답에 프레임 차단 헤더 강제 (서블릿 필터)
public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
        throws IOException, ServletException {
    HttpServletResponse r = (HttpServletResponse) res;
    r.setHeader("X-Frame-Options", "DENY");                       // 구형 브라우저 호환
    r.setHeader("Content-Security-Policy",
                "frame-ancestors 'none'");                        // 현대 표준
    // 필요 시 특정 출처만: frame-ancestors 'self' https://trusted.example
    fc.doFilter(req, res);
}
방어 핵심: 상태를 바꾸는 페이지(송금·설정·삭제)에는 X-Frame-Options: DENY와 CSP frame-ancestors를 함께 설정할 것 · 스캐너(Burp 005009a0)는 응답 헤더만 보고 이를 잡는다 · SameSite 쿠키는 보조 수단일 뿐 프레임 차단을 대체하지 못한다.
⚠️ 교육용 시뮬레이션입니다. 모든 공격은 페이지 내부 가상 타겟에서만 시연되며 실제 네트워크 전송이나 외부 시스템 접근은 없습니다. 페이로드 집합은 Burp Suite Pro 기법 카탈로그의 교육용 엄선 서브셋입니다.