🌐 CORS 구성 오류 시뮬레이터 Burp 00200600 · CORS

Access-Control-Allow-Origin에 요청의 Origin을 그대로 반사하고 자격증명을 허용하면, 임의 사이트의 스크립트가 로그인된 사용자의 데이터를 읽어 갈 수 있습니다.

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

공격자 사이트(evil.example)의 스크립트가 사용자의 인증 세션으로 API를 호출합니다. 서버가 Origin을 어떻게 반사하는지에 따라 데이터가 넘어가는지가 결정됩니다.

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

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

② 취약 vs 안전 코드

VULNERABLE
// Node/Express - Origin 을 그대로 반사 (자격증명 포함)
app.use((req, res, next) => {
    const origin = req.headers.origin;
    if (origin) {
        // 🚨 임의 출처 반사 + 쿠키 자격증명 허용
        res.setHeader("Access-Control-Allow-Origin", origin);
        res.setHeader("Access-Control-Allow-Credentials", "true");
    }
    next();
});
SECURE
// 허용목록 검증 - 정확 일치만, 자격증명은 신뢰 출처에만
const ALLOW = new Set(["https://vuln-sim.web.app", "https://app.example"]);
app.use((req, res, next) => {
    const origin = req.headers.origin;
    if (origin && ALLOW.has(origin)) {          // ✅ 정확 일치만
        res.setHeader("Vary", "Origin");        // 캐시 오염 방지
        res.setHeader("Access-Control-Allow-Origin", origin);
        res.setHeader("Access-Control-Allow-Credentials", "true");
    }
    // 목록에 없으면 CORS 헤더 자체를 안 보냄 → 브라우저가 읽기 차단
    next();
});
방어 핵심: Origin 반사 대신 허용목록 정확 일치 · null 출처와 자격증명 조합 금지 · Vary: Origin 누락 시 프록시 캐시에 다른 사용자 응답 오염 가능 · 스캐너(Burp 00200600)는 임의 Origin 반사를 보내 응답 헤더로 판정한다.
⚠️ 교육용 시뮬레이션입니다. 모든 공격은 페이지 내부 가상 타겟에서만 시연되며 실제 네트워크 전송이나 외부 시스템 접근은 없습니다. 페이로드 집합은 Burp Suite Pro 기법 카탈로그의 교육용 엄선 서브셋입니다.