티스토리 뷰

728x90
반응형

출처 : http://xss-game.appspot.com/level6

 

마지막 단계에서는 어떤 input 도 없는 상황에서 alert 를 띄워야 한다. 힌트로는 "make the application request an external file" 라고 되어 있다. 이 말을 보자마자 script 태그가 있고, 그 script 태그가 다른 어떤 src 파일을 가지고 있나 싶어서 소스코드를 살펴보았다.

 

 

희한하게 /static/gadget.js 를 여러개 포함하고 있었는데, 마침 div id="log" 태그의 내용으로 /static/gadget.js 문자열이 보였고, 또 마침 URL의 hash 태그에도 공통적으로 있음을 알 수 있다.

<iframe class="game-frame" src="/level6/frame#/static/gadget.js"></iframe>

그래서 위에 URL을 참고하여, /level6/frame#test 라고 입력하면 어떤 결과가 나오는 지 살펴보았다. 그리고 script 부분이랑 div#log 부분에 우리가 입력한 내용이 들어가는 걸 알 수 있다.

 

 

가장 일차원적으로 생각할 수 있는 방법으로는 script 자체를 injection 하는 방법이었다. 하지만 아래 이미지를 보다시피 따옴표나 꺽쇠 기호는 모두 URL 인코딩되어져 들어갔다.

 

 

하지만 특이하게도 아래와 같은 기호들은 인코딩이 되어지지 않음을 알 수 있었다.

 

 

그러면 우리는 아래와 같이 입력할 수 있게 된다. 이런 것을 Data URIs 라고 부르는데 자세한 건 아래 링크를 참고하자.

developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Data_URIs

data:javascript,alert(1)

이 URL 을 한번 브라우저 URL에 입력하고, 접속해보자. 그러면 alert(1) 이라는 내용이 출력되어져 보일 것이다. 그렇기에 위 문장이 결국 하나의 작은 문서를 만들어주는 역할을 함으로써, script 태그의 src에 추가할 수 있게 되는 것이다.

 

script 태그는 src 속성 안에 있는 값을 읽어 들여, 기본값인 javascript 문법으로 해석하여 실행해주기 때문에, 아래의 코드는 alert(1) 가 실행되게 된다. 원래 Data URIs 에서 data: 다음에 오는 것을 MIME 타입이라고 하는데, 여기서 MIME 타입이 별로 중요하지 않는 이유는 어쩌피 script 태그에 들어가기 때문에 script 태그는 해당 문서가 어떤 형식이던 간에 javascript 파일로 해석할 것이기 때문이다.

<script src="data:javascript,alert(1)"></script>
또는
<script src="data:,alert(1)"></script>
또는
<script src="data:text,alert(1)"></script>

등등

 

 

- 끝 -

728x90
반응형
댓글