본문 바로가기

WARGAME/xss-game [web]

xss-game / Level 6: Follow the 🐇 [write-up]

Level 6: Follow the 🐇

- 복잡한 응용프로그램의 경우 url 파라미터나 location.hash를 기반으로  javascript 라이브러리를 동적으로 로드할 수 있는 공간이 있다. 

- 스크립트 또는XML HttpRequest와 같은 잠재적으로 위험한 다른 유형의 데이터를 로드 할 때 사용자 입력이URL에 영향을 주도록 허용하면 심각한 취약점이 발생할 수 있다.

 

- 응용 프로그램이 외부 파일을 요청하여alert ()을 실행시키는 방법을 찾아라.

 

 

 

힌트를 보자.

1. url 에서 #뒤의 문자열이 화면 스크립트에 어떻게 반영되는지 보라.

2. 가젯의 url보안 검사가 정말 안전한가?

4. google.com/jsapi?callback=foo 을 통해 해결할 수 있다.

 

 

흠..... 일단 # 뒤 문자열을 수정해보자.

# 뒤에 입력한 hey  html 에 나타난다.

 

 

 

이런 상관 관계가 있음을 확인하고, 프레임 소스 보기로 좀더 자세히 봐야겠다.

우선 자바스크립트 부분을 살펴보면,

 

includeGadget () 

: script 객체 생성

: url  http가 아니면 script 에서 src 속성 값을 url로 넘김

: script 에서 onload onerror 속성 정의

: head 태그 자식으로 script 추가

 

 

getGadgetName() 도 살펴보기전에

문제 설명에도 나와있었던 location.hash에 대해 간단히 정리하고 살펴봐야겠다.

 

* location

: Window 객체의location 프로퍼티는 현재 창에 표시된 문서의URL을 나타내는Location 객체와 연결

: Location의 properties 중 하나로 hash 가 있고,

hash는 주소 값에 붙어 있는 anchor 값을 반환한다.

 

예를 들어 도메인이 http://www.abc.com:8080/search?q=uu#test라면,

hash는 #test가 된다.

참고: https://iamawebdeveloper.tistory.com/41 

 

 

 

이제 다시 getGadgetName()을 살펴보자.

 

getGadgetName()

: location.hash , # 이후 스트링을 가져오거나, “/static/gadget.js”을 리턴

 

 

각각의 함수를 통해 살펴본 결과 두가지 방법으로 해결할 수 있을 것 같다.

방법1. http://  HTTP:// 등으로 우회한 후 임의의 서버에 alert() 를 올려두어

          script  src 속성과 onerror 등을 이용해 alert() 띄우기

방법2. Data URL Scheme 사용하기

 

* 여기서 Data URL Scheme 이,

: 이미지 같은 외부 데이터를 URL 형태로 표현하는 방법

: html 에서 img태그에 src 속성으로 이미지의 경로를 적었다면, 

Data URL Scheme을 통해 src 속성 값으로 넣고자 하는 이미지의 base64 인코딩 값을 직접 입력할 수 있다.

 

: 기본 포맷

  data:[<MIME-type>][;charset=<encoding>][;base64],<data>


참고- https://m.blog.naver.com/PostView.nhn?blogId=krquddnr37&logNo=220294300235&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://thingsthis.tistory.com/17

 

 

 

따라서 Data URL Scheme 를 사용할 경우, url 의 # 뒤에data:text/javascript, alert() 를 입력하면

성공!

 

 

 

 

Done

짜릿

 

구글링하다보니 문제 풀이가 다양한 것 같은데 정말 이해하는 것부터 많이 어려웠던 문제였다.