jyamethyst21 님의 블로그

XSS(DOM XSS, Reflected XSS, Stored XSS) 본문

보안 & IT 지식 🌺

XSS(DOM XSS, Reflected XSS, Stored XSS)

jyamethyst21 2026. 4. 20. 23:34

1. Reflected XSS

Reflected XSS는 사용자의 입력값이 서버를 거쳐 그대로 응답 페이지에 반영되면서 실행되는 취약점이다. 데이터가 서버에 저장되지 않고, 요청과 동시에 즉시 반사되어 실행된다는 특징을 가진다. 주로 URL 파라미터를 통해 전달된 값이 검증 없이 HTML이나 자바스크립트 코드에 삽입될 때 발생한다.

<!doctype html>
<html>
  <head>
	<title>Quiz 4</title>
    <script>
      function startTimer(seconds) {
        seconds = parseInt(seconds) || 1;
        setTimeout(function() { 
          window.confirm("메인페이지로 이동합니다.");
          window.history.back();
        }, seconds * 1000);
      }
    </script>
  </head>
  <body id="level4">
    <br>
    <img src="iu1.jpg" onload="startTimer('5000');" />
    <br>
  </body>
</html>

예를 들어, 입력받을 수 있는 텍스트 박스와 상기 코드가 있다고 치자.

상기 코드는 일정 시간이 되면 이전 페이지로 이동하는 함수를 가지고 있고, 해당 함수는 <img src~> 부분에서 호출이 되고 있는데 이때 함수에 들어가는 파라미터값이 외부 입력값으로부터 동적으로 삽입되는 구조라면 Reflected XSS 취약점이 발생할 수 있다.

 

즉, URL 파라미터 값이 자바스크립트 코드의 일부로 들어가게 되고, 이 값을 조작하면 기존 함수 실행 흐름을 끊고 원하는 스크립트를 삽입할 수 있다. 이러한 경우에는 함수 호출 구문을 강제로 종료한 뒤 새로운 코드를 이어붙이는 방식으로 공격이 가능하다. 예를 들어 다음과 같은 방식으로 입력값을 구성하면 onload 속성에서 벗어나 바로 alert를 실행할 수 있다.

기존~~);alert('XSS

 

이처럼 사용자가 특정 URL에 접속하는 순간 스크립트가 실행되며, 입력값이 저장되지 않고 즉시 반영되기 때문에 Reflected XSS에 해당한다.

 

2. Stored XSS

Stored XSS는 공격자가 입력한 악성 스크립트가 서버 또는 데이터베이스에 저장된 뒤, 다른 사용자가 해당 데이터를 조회할 때 실행되는 취약점이다. 한 번 저장되면 여러 사용자에게 반복적으로 영향을 줄 수 있기 때문에 가장 위험한 유형 중 하나이다.

위와 같이 입력창이 존재하고, xss 취약점이 존재한다는 걸 안다고 가정해보겠다.

이 경우, <script>alert(내용);</script> 명령어를 쳤을 때 아무런 반응이 없고, 입력값이 화면에 출력되는 과정에서 HTML5 innerHTML이 사용되는 구조에서는 script 태그를 만날 때 해당 태그가 실행되지 않는다. (HTML5 는 innerHTML 과 함께 삽입된 <script> 태그가 실행되지 않도록 지정합니다. [출처: MDN]) 또한, 일반적으로 <script> 태그는 필터링되는 경우가 많지만, 이벤트 속성을 활용하면 이를 우회할 수 있다.

대표적인 방법은 <img> 태그의 onerror 이벤트를 이용하는 것이다. 이미지 로딩이 실패할 경우 자동으로 자바스크트가 실행되는 구조를 활용하는 방식이다. 그렇기 때문에 위와 같은 구조에서는 다음과 같은 입력을 사용하면 alert를 실행할 수 있다.

<img src="" onerror="alert('XSS')">

이 코드는 script 태그를 사용하지 않기 때문에 필터링이나 innerHTML 구조를 우회할 수 있으며, 데이터가 저장된 이후 페이지에 출력될 때마다 반복적으로 실행된다. 이러한 특징 때문에 Stored XSS로 분류된다.

3. DOM XSS

DOM XSS는 서버가 아닌 클라이언트 측 자바스크립트에서 발생하는 취약점이다. 서버 응답에는 문제가 없지만, 브라우저에서 실행되는 자바스크립트가 사용자 입력을 그대로 DOM에 반영하면서 발생한다. 특히 URL의 해시 값(#)이나 파라미터를 자바스크립트가 직접 처리할 때 자주 나타난다.

해당 구조에서는 URL의 해시 값이 변경되면 서버 요청 없이 즉시 화면에 반영되는 특징을 보인다. 이는 자바스크립트가 location.hash 값을 읽어 그대로 DOM에 삽입하고 있음을 의미한다. 이때 .html()과 같은 메서드를 사용하여 입력값을 검증 없이 삽입하면 XSS 취약점이 발생한다.

공격 방식은 기존 HTML 구조를 강제로 종료한 뒤 새로운 스크립트를 삽입하는 형태로 이루어진다. 예를 들어 다음과 같은 페이로드를 사용할 수 있다.

#'><script>alert('XSS')</script>

또는 실제 URL 형태로는 다음과 같이 구성된다.

http://target-site.com/page#'><script>alert('XSS')</script>

이 경우 서버를 거치지 않고 브라우저에서 바로 실행되기 때문에 DOM XSS에 해당한다.