본문 바로가기 ← 메인

🛡️ 크로스사이트 요청 위조 (CSRF) - 실습 시뮬레이터

CWE-352: Cross-Site Request Forgery (CSRF)

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ CSRF 취약점 식별
  • ⬜ CSRF 토큰 검증 구현
✏️ Java 코드 에디터 취약한 코드
UserController.java 💡 세션의 CSRF 토큰과 요청 토큰을 equals()로 비교하세요. (보조: Referer 검증)
public void doPrivilegedAction(HttpServletRequest request) {
    // [취약한 코드] 세션만 확인하고 요청 출처(Referer)를 확인하지 않음
    // 공격자가 피싱 사이트에서 요청을 보내도 세션이 유효하면 실행됨
    HttpSession session = request.getSession(false);

    if (session != null) {
        // ... 중요 기능 실행 (예: 회원정보 수정) ...
    }
}
💡 수정 가이드 (KISA 가이드)
1. CSRF 토큰 검증 (근본 대책)

폼 출력 시 세션에 예측 불가능한 토큰을 저장하고, 요청 처리 시 세션 토큰과 요청 토큰이 일치하는지 확인합니다.

String sessionToken = (String) request.getSession().getAttribute("csrfToken"); String formToken = request.getParameter("csrfToken"); if (sessionToken != null && sessionToken.equals(formToken)) { // 정상 실행 } else { // 차단 (403) }
2. Referer/Origin 검증 (보조 · 심층 방어)

요청 헤더의 Referer 값이 허용된 도메인으로 시작하는지 확인합니다. 단, Referer는 비어 있을 수 있어 단독 방어로는 부족합니다.

String referer = request.getHeader("Referer"); if (referer != null && referer.startsWith("https://my-secure-site.com")) { // 정상 실행 } else { // 차단 }
📊 분석 결과 및 설명
🎯 목표

중요한 상태 변경 요청(수정, 삭제, 등록 등) 시, 요청이 정당한 경로(자사 도메인)에서 시작되었는지 검증해야 합니다.

⚠️ 현재 취약점

CSRF

로그인된 사용자가 공격자가 심어놓은 링크를 클릭하면 사용자의 의지와 무관하게 공격자가 의도한 행위가 실행될 수 있습니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ CSRF 미흡 식별
  • ⬜ CSRFProtect 적용
🐍 Python 코드 에디터 취약한 코드
app.py (Flask) 💡 Flask-WTF의 CSRFProtect를 적용하세요.
from flask import Flask, request

app = Flask(__name__)

# [취약한 코드] 상태 변경 요청(POST)에 대해 CSRF 토큰을 검증하지 않음
@app.route('/update_profile', methods=['POST'])
def update_profile():
    email = request.form['email']
    # 프로필 업데이트 로직...
    return "Updated"
💡 수정 가이드 (파이썬 가이드)
1. CSRFProtect 미들웨어 사용

Flask-WTF 라이브러리의 CSRFProtect를 사용하여 전역적으로 토큰을 검증합니다.

from flask_wtf.csrf import CSRFProtect csrf = CSRFProtect(app) # 이후 모든 POST 요청에서 CSRF 토큰 자동 검증
📊 분석 결과 및 설명
🎯 목표

상태 변경 요청 시 임의의 난수 값(Token)을 검증하여 요청의 정당성을 확인해야 합니다.

⚠️ 현재 취약점

CSRF Vulnerability

보호 메커니즘 부재로 인해 외부 사이트에서의 위조된 요청이 성공할 수 있습니다.

📰 실제 사고사례 & 표준 매핑
2008년 Gmail CSRF로 피해자 몰래 메일 전달 필터가 추가돼 메일이 외부로 유출됐습니다.
🏷️ CWE-352 OWASP A01 Broken Access Control
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류