Security Info。

XSS (Cross-Site Scripting): 크로스사이트 스크립트 취약점

Security Everything 2024. 12. 31. 11:10



 

XSS(Cross-Site Scripting)는 공격자가 웹 애플리케이션의 입력 필드나 URL 등을 통해 악성 스크립트를 삽입하여, 피해자의 브라우저에서 실행되도록 하는 웹 보안 취약점입니다.
이 공격은 주로 사용자 데이터 탈취, 세션 하이재킹(Session Hijacking), 웹사이트 변조 등을 목적으로 사용됩니다.

이 글에서는 XSS의 정의, 유형, 피해 사례, 그리고 이를 방어하는 방법에 대해 알아보겠습니다.


XSS의 개념

XSS는 웹 애플리케이션이 사용자 입력을 적절히 검증하지 않고 페이지에 삽입하거나 반환할 때 발생합니다.
피해자의 브라우저는 악성 코드를 신뢰된 웹사이트의 일부로 인식하여 실행하게 됩니다.

주요 목표

  • 사용자 세션 탈취.
  • 민감한 정보(쿠키, 인증 토큰) 유출.
  • 웹 페이지의 악의적인 변조.

XSS의 주요 유형

1. Stored XSS (저장형 XSS)

공격 코드가 데이터베이스나 서버에 저장되어 다수의 사용자가 이를 로드할 때 실행됩니다.

예시:

<script>alert('Your session has been hacked!')</script>
  1. 공격자가 댓글 입력 필드에 악성 스크립트를 삽입. 
  2. 이 스크립트가 서버에 저장되고, 페이지를 열람하는 모든 사용자에게 실행됩니다.

특징:

  • 다수의 사용자에게 영향을 미칠 수 있어 위험도가 높음.

2. Reflected XSS (반사형 XSS)

악성 코드가 URL 등의 입력값을 통해 서버로 전달된 후 즉시 응답에 반영되어 실행됩니다.

예시:

http://example.com/search?q=<script>alert('Hacked!')</script>
  1. 공격자가 다음과 같은 링크를 전송:
     
  2. 사용자가 이 링크를 클릭하면, 서버가 입력값을 반영하여 브라우저에서 스크립트를 실행.

특징:

  • 이메일, 메시지 링크 등으로 피해자를 유도하는 방식이 일반적.

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

악성 코드가 서버와의 통신 없이 클라이언트 측에서 DOM(Document Object Model)을 통해 실행됩니다.

예시:

http://example.com/#<script>document.cookie</script>
  1. 공격자가 다음과 같은 링크를 전달:
  2. 브라우저가 링크를 해석하며 DOM 구조를 조작해 악성 코드 실행.

특징:

  • 클라이언트 측 코드에서 발생하며, 서버와의 상호작용 없이 진행됨.

XSS의 피해 사례

  1. 세션 하이재킹
    • 사용자의 쿠키를 탈취하여 세션 정보를 가로챔.
    • 공격자는 피해자의 신분으로 웹사이트에 로그인하여 행동 가능.
  2. 웹사이트 변조
    • 웹 페이지에 악성 스크립트를 삽입해 가짜 로그인 창 등을 표시.
    • 피싱 사이트와 유사한 형태로 데이터를 탈취.
  3. 멀웨어 배포
    • 스크립트를 통해 피해자의 브라우저에 악성 프로그램을 다운로드 및 실행.

XSS 방어 방법

1. 입력값 검증 및 필터링

  • 화이트리스트 검증: 허용된 입력만 처리.
  • 특수 문자 필터링: '<', '>', '"' 등 스크립트 실행에 사용되는 문자를 무력화.

예시:
입력값에서 <script>를 무효화:

import html
safe_input = html.escape(user_input)

2. 출력 시 인코딩

  • 사용자 입력 데이터를 HTML, JavaScript, URL 등에 출력하기 전에 안전하게 인코딩 처리.
  • 예를 들어, <script>는 &lt;script&gt;로 변환.

3. Content Security Policy (CSP)

  • CSP는 브라우저가 실행할 수 있는 스크립트 소스를 제한합니다.
  • 외부 스크립트 로드를 방지하고, 인라인 스크립트 실행을 차단.

CSP 설정 예시 (HTTP 헤더):

Content-Security-Policy: script-src 'self' https://trusted-scripts.com

4. HTTPOnly 쿠키 사용

  • 세션 쿠키에 HTTPOnly 속성을 설정하여 JavaScript를 통해 접근하지 못하도록 보호.

예시:

Set-Cookie: session_id=abc123; HttpOnly

5. 보안 라이브러리 활용

  • OWASP에서 제공하는 ESAPI(Enterprise Security API) 등 보안 라이브러리를 활용.

결론

XSS는 적절한 입력 검증과 보안 설정을 통해 충분히 방어할 수 있는 취약점입니다.
저장형, 반사형, DOM 기반 XSS의 차이점을 이해하고, 방어 방법을 체계적으로 적용하면 웹 애플리케이션의 보안을 강화할 수 있습니다.
꾸준한 보안 테스트와 코드 리뷰를 통해 XSS 발생 가능성을 줄이는 것이 중요합니다.