XSS(Cross-Site Scripting) : 공격 유형, 예상 시나리오, 방어 기법

2024. 9. 28. 01:09·지식/Web
728x90
반응형


1. XSS(Cross-Site Scripting) 란?

XSS는 웹 애플리케이션의 취약점을 이용해 악성 스크립트를 삽입하는 공격 기법입니다. 공격자가 삽입한 스크립트가 다른 사용자의 브라우저에서 실행되어 사용자의 정보를 탈취하거나 악의적인 행동을 수행할 수 있습니다.


2. XSS(Cross-Site Scripting) 주요 특징

  • 웹사이트 관리자가 아닌 공격자가 웹 페이지에 스크립트를 삽입합니다.
  • 주로 사용자 입력값을 제대로 검증하지 않고 사용할 때 발생합니다.
  • 공격자는 사용자의 쿠키, 세션 등 중요 정보를 탈취하거나 비정상적인 기능을 수행하게 할 수 있습니다.
  • SQL injection과 함께 가장 기초적인 웹 취약점 공격 방법 중 하나입니다.

3. XSS(Cross-Site Scripting) 공격 유형 및 시나리오

3.1 Stored XSS (저장형)

서버에 악성 스크립트를 저장하여 지속적으로 공격하는 방식입니다. 주로 게시판, 댓글 등에서 발생합니다.

  • 예상 시나리오
    1. 공격자는 웹사이트의 게시판이나 댓글 기능을 통해 위와 같은 스크립트를 삽입합니다. 이 스크립트는 서버에 저장됩니다.
    2. 이후 해당 게시글이나 댓글을 방문하는 모든 사용자는 페이지가 로드될 때마다 자동으로 window.location.href를 통해 네이버(https://naver.com)로 리디렉션 됩니다.
<script>
  window.onload = function() {
    window.location.href = "https://naver.com";
  };
</script>

3.2 Reflected XSS (반사형)

URL 파라미터 등을 통해 전달된 악성 스크립트가 즉시 실행되는 방식입니다.

  • 예상 시나리오
    1. 사용자가 특정 링크(예: http://bigdwarf.blog/search?param=<script>alert('안녕하세요.')</script>)를 클릭하면, 서버는 param 파라미터의 값을 응답 페이지에 반사하여 사용자의 브라우저에서 악성 스크립트를 실행합니다.
    2. 결과적으로, alert(' 안녕하세요.')가 실행되어 브라우저에 경고창이 뜨게 됩니다.
http://bigdwarf.blog/search?param=<script>alert('안녕하세요.')</script>

3.3 DOM-based XSS

DOM-based XSS는 서버가 아닌 클라이언트 측 즉 브라우저에서 동적으로 생성된 DOM(Document Object Model) 요소에 의해 발생하는 XSS 공격입니다. 이 유형의 XSS는 서버와 상관없이 클라이언트 측 자바스크립트 코드가 잘못된 사용자 입력을 DOM에 직접 반영하면서 발생합니다.

  • 예상 시나리오
    1. 사용자가 아래와 같은 URL을 방문합니다.
    2. 페이지 로드 시 클라이언트 측 자바스크립트 코드가 URL의 해시 값(#user=...)을 읽어 DOM에 반영하도록 되어 있다고 가정합니다.
    3. 자바스크립트 코드가 URL 해시 값에 포함된 <script> 태그를 DOM에 추가하면서 악성 스크립트가 브라우저에서 실행됩니다.
    4. 결과적으로 alert('DOM XSS')가 실행되어 경고창이 뜨게 됩니다.
URL: http://bigdwarf.blog#user=<script>alert('DOM 안녕하세요.')</script>
<script>
  window.onload = function() {
    // URL의 해시(#) 부분을 가져와서 userName이라는 ID를 가진 요소에 삽입
    var userInput = window.location.hash.substring(1);
    document.getElementById("userName").innerHTML = userInput;
  };
</script>

4. XSS(Cross-Site Scripting) 방어 기법

4.1 입력 검증 및 필터링

  • 사용자 입력을 받는 모든 곳에서 입력값을 철저히 검증하고 필터링해야 합니다. 필터링에는 화이트리스트 기반 접근 방식이 가장 효과적입니다. 예를 들어 사용자 이름에는 알파벳과 숫자만 허용하는 정규 표현식을 사용할 수 있습니다.
function validateInput(input) {
  // 사용자 이름은 알파벳과 숫자만 허용
  var regex = /^[a-zA-Z0-9]+$/;
  if(!regex.test(input)) {
    throw new Error('Invalid input');
  }
  return input;
}
  • 또한, HTML 특수 문자를 이스케이프 하여 스크립트가 실행되지 않도록 해야 합니다.
function escapeHTML(str) {
  return str.replace(/[&<>"']/g, function(match) {
    return {
      '&': '&amp;',
      '<': '&lt;',
      '>': '&gt;',
      '"': '&quot;',
      "'": '&#39;'
    }[match];
  });
}

4.2 출력 인코딩

  • 서버에서 동적으로 생성된 콘텐츠를 클라이언트에 출력할 때는 반드시 적절한 인코딩을 적용해야 합니다. 예를 들어 HTML 콘텐츠를 출력할 때는 아래와 같은 방식으로 인코딩할 수 있습니다.
function encodeForHTML(content) {
  return content.replace(/&/g, '&amp;')
                .replace(/</g, '&lt;')
                .replace(/>/g, '&gt;')
                .replace(/"/g, '&quot;')
                .replace(/'/g, '&#39;');
}

이와 같은 방식으로 자바스크립트, CSS, URL 등의 다른 컨텍스트에서도 각각 적절한 인코딩 방식을 적용해야 합니다.

4.3 Content Security Policy (CSP) 사용

  • CSP는 스크립트 소스, 스타일시트 소스, 이미지 소스 등을 제어하여 XSS 공격을 방지할 수 있는 강력한 도구입니다. 기본적으로 신뢰할 수 있는 소스만 실행하도록 제한할 수 있습니다.
Content-Security-Policy: default-src 'self'; script-src 'self' https://bigdwarf.blog;

이 정책은 스크립트가 'self' (현재 도메인)와 https://bigdwarf.blog에서만 로드될 수 있도록 허용합니다.

4.4 HttpOnly 쿠키 사용

  • 쿠키에 HttpOnly 속성을 추가하면 클라이언트 측 스크립트에서 쿠키에 접근할 수 없게 됩니다. 이로 인해 XSS 공격으로부터 세션 쿠키가 보호됩니다.
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict;
  1. HttpOnly: 자바스크립트에서 쿠키 접근을 차단합니다.
  2. Secure: HTTPS를 통해서만 쿠키가 전송됩니다.
  3. SameSite=Strict: 동일한 사이트에서만 쿠키가 전송되도록 제한합니다.

4.5 그 외 여러 방법

  • 템플릿 엔진 사용: 템플릿 엔진(예: Thymeleaf, Handlebars 등)을 사용할 때 기본적으로 XSS 공격을 예방하는 메커니즘이 적용되는 점을 설명할 수 있습니다.
  • 프레임워크 레벨 보안 기능: 다양한 웹 프레임워크(Spring, Django 등)에서 제공하는 기본적인 XSS 방어 기능에 대해 설명하고, 이러한 기능을 활성화하는 방법을 다룰 수 있습니다.
  • 도구를 사용한 정적 분석: SonarQube, Fortify 같은 정적 분석 도구를 사용하여 코드에서 잠재적인 XSS 취약점을 탐지하는 방법을 소개할 수 있습니다.
  • 보안 테스트: OWASP ZAP, Burp Suite와 같은 도구를 사용해 XSS 취약점을 스캔하고 제거하는 방법을 설명할 수 있습니다.

5. 마무리

앞서 설명한 방법들은 XSS 공격을 방지하는 데 있어 강력한 방어 수단이 될 수 있으며, 이를 통해 여러분의 웹 애플리케이션을 보다 안전하게 보호할 수 있습니다. 하지만 보안은 한 번의 조치로 끝나는 것이 아니라, 지속적인 점검과 개선이 필요한 과정입니다. 따라서 정기적으로 보안 테스트를 실시하고, 최신 보안 동향을 파악하여 꾸준히 웹 애플리케이션의 보안을 강화하는 노력이 필요합니다. XSS 공격에 대한 철저한 대비를 통해, 신뢰할 수 있는 안전한 웹 환경을 구축하시기 바랍니다.


 

728x90
반응형

'지식 > Web' 카테고리의 다른 글

브라우저 저장소 : 로컬 스토리지, 세션 스토리지, 쿠키  (0) 2024.09.16
'지식/Web' 카테고리의 다른 글
  • 브라우저 저장소 : 로컬 스토리지, 세션 스토리지, 쿠키
키큰난쟁이
키큰난쟁이
개발 블로그
    반응형
    250x250
  • 키큰난쟁이
    키큰난쟁이의 놀이터
    키큰난쟁이
  • 전체
    오늘
    어제
    • 분류 전체보기 (38)
      • AI (1)
        • AI 응용 (1)
      • 프로그래밍 언어 (5)
        • Java (3)
        • PHP (1)
        • JavaScript (1)
      • 프레임워크 (3)
        • Spring (3)
      • 서버 (8)
        • Web Server (2)
        • WAS (2)
        • Hypervisor (4)
      • 데이터베이스 (5)
        • MySQL•MariaDB (2)
        • Oracle (1)
        • Cubrid (2)
      • 운영체제 (4)
        • Linux (4)
      • 클라우드 (1)
        • Ncloud (1)
      • 데브옵스 (7)
        • VCS (2)
        • CICD (3)
        • Docker (2)
      • 지식 (2)
        • Web (2)
      • 기타 (2)
        • 일상 (2)
  • 블로그 메뉴

    • 일상
  • 링크

    • Instagram
    • github
  • 공지사항

    • 라이믹스 → 티스토리 이사
  • 인기 글

  • 태그

    깃허브
    GitHub
    우분투
    마리아디비
    프록시모스
    PROXMOX
    애플실리콘
    CI/CD
    mariadb
    리눅스
    jenkins
    docker
    devops
    db
    도커
    DBMS
    자바
    java
    젠킨스
    Apple Silicon
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
키큰난쟁이
XSS(Cross-Site Scripting) : 공격 유형, 예상 시나리오, 방어 기법
상단으로

티스토리툴바