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

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

✅ 학습 진행도
  • 진단 시작
  • CSRF 취약점 식별
  • Referer 검증 구현
✏️ Java 코드 에디터 취약한 코드
UserController.java 💡 getHeader("Referer")를 사용하여 요청 출처를 확인하세요.
public void doPrivilegedAction(HttpServletRequest request) {
    // [취약한 코드] 세션만 확인하고 요청 출처(Referer)를 확인하지 않음
    // 공격자가 피싱 사이트에서 요청을 보내도 세션이 유효하면 실행됨
    HttpSession session = request.getSession(false);
    
    if (session != null) {
        // ... 중요 기능 실행 (예: 회원정보 수정) ...
    }
}
💡 수정 가이드 (KISA 가이드)
1. Referer 검증

요청 헤더의 Referer 값이 허용된 도메인으로 시작하는지 확인합니다.

String referer = request.getHeader("Referer"); if (referer != null && referer.startsWith("http://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

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