본문 바로가기

해킹/Web Hacking

DOM Based XSS와 Reflected XSS의 차이점

XSS 공부를 하다보면 DOM Based 와 Refleceted에 대해서 헷갈리게 될 때가 온다.

하지만 조사를 하다보니 느낀 건 스크립트가 심어져서 실행되는 시점이 다르다는 결론이었다.

 

클라이언트 측에서 DOM을 통해 동적 페이지 구성을 하는 기능에서 XSS 발생되는 것이 DOM XSS

 

서버 측에서 동적 페이지 구성을 하다가 XSS가 터지는 것을 Reflected XSS라고 한다.

 

DOM Based XSS의 경우는 페이지를 한번 로드하고 새로고침이 되지 않더라도 XSS를 심어 계속 크사를 터트릴 수있지만

 

Reflected XSS를 터트리는 링크는 1회성으로 한번 터트리고 나면 새로고침을 해야 다시 스크립트가 실행된다.

 

서버가 페이지를 내려주는 응답이 있어야만 터지는 것이다.

 

DOM이란?

DOM은 Document Object Model의 약자입니다.문서 객체 모델이라는 의미인데요

<html>이나 <body>같은 태그에 기반해서 페이지를 트리 형식으로 구조화합니다.

 

서버에서 요청을 받을 때 이렇게 DOM이라는 공장을 돌려서 페이지를 렌더링하는 과정을 거치는 것입니다.

document라는 최상위 객체가 있고 그 밑에 html 그 다음 head와 body로 트리 구조화 되어있는 것을 확인할 수 있습니다.

출처 : YKSS

 

 

DOM Based XSS

다음은 DOM Based XSS를 일으킬 수 있는 취약점이 있는 코드입니다.

 

간단한 index.jsp 코드입니다.

url 주소에 해시 값이 존재하면 ,서버로 해시 값 경로에 위치한 페이지를 요청합니다.

해시 값 변경이 발생할 때마다 서버에 특정 페이지를 요청합니다.

   <script type="text/javascript">
        const hash = window.location.hash.slice(1)
        if (hash) {
            window.location.href = decodeURIComponent(hash)
        }
        window.addEventListener('hashchange', function () {
            window.location.href = decodeURIComponent(window.location.hash.slice(1))
        });
    </script>

 

이 페이지를 통해 XSS를 터트리게 되면 한번만 페이지를 로드하게 되면 그 다음부터는 서버에 페이지를 요청시키지 않아도 스크립트를 터트릴 수 있게 됩니다.

 

이 부분이 Reflected XSS와의 가장 큰 차이점입니다.

 

 

 


소스 참조

인프런 Q&A : https://www.inflearn.com/questions/155043/dom-%EA%B3%BC-reflected%EC%9D%98-%EC%B0%A8%EC%9D%B4

DOM Based XSS : https://junhyunny.github.io/information/security/dom-based-cross-site-scripting/

DOM이란? : https://m.blog.naver.com/magnking/220972680805

DOM 구조화 그림 : https://ykss.netlify.app/web/DOM/