본문 바로가기

1. Web hacking (웹 해킹)/1) Write UP

[2020.05.19] XSS Game Level6

 

문제 설명을 보면, 복잡한 웹 응용 프로그램이 URL 매개 변수 값 또는 location.hash의 일부를 기반으로 JavaScript 라이브러리를 동적으로 로드하는 기능을 소개하고 있다. 스크립트를 로드 할 때 사용자 입력이 URL에 영향을 주거나 XMLHttpRequest와 같은 잠재적으로 위험한 유형의 데이터 (예 : XMLHttpRequest)를 허용하면 심각한 취약점이 발생할 수 있다는 점을 알려주고 있다. 특이한 점은, 응용 프로그램이 외부 파일을 요청하여 alert ()을 실행시킬 것을 요청하고 있다는 것이다.

 

페이지 화면을 살펴보면, # 뒤에 있는 경로가 화면으로 출력되는 것을 알 수 있다.

 

 

 

힌트를 참조해 보면, 실행화면과 문제설명에서 확인했듯이, #뒤의 경로가 로드된 스크립트의 URL에 영향을 준다는 것을 확인할 수 있다. 또한 4번 힌트로 google.com/jsapi?callback=foo를 확인하라고 설명이 되어있다.

 

 

google.com/jsapi?callback=foo를 검색해 보면, 문자가 가득한 화면이 나온다. 기존 실행화면에서 #뒤의 경로가 로드된 스크립트의 URL에 영향을 주었다는 것에 착안하여, 해당 주소의 파라미터 값을 기준으로 살펴보았다.

 

 

 

화면을 계속해서 내려 보면, callback 함수에 해당하는 파라미터 값이 함수로 생성됨을 확인 할 수 있다.

이를 기반으로 볼 때, 이 문제의 목표인 alert() 를 실행시키기 위해서는, #뒤의 경로로 alert()함수가 생성된 외부 파일 주소를 삽입하면 된다는 것을 알수있다. (https://www.google.com/jsapi?callback=alert)

단, 아래의 문제 코드를 참조해 볼 때(라인 20~25), https로 시작하는 url을 evil URLs로 인식하여 "Sorry, cannot load a URL containing \"http\" 를 반환하고 있음을 확인할 수 있다. 이를 우회하기 위해 태그 및 속성 필터링 중 대문자 혹은 소문자 만을 인식하는 필터 우회를 반영하여 외부 파일 주소를 삽입하면 된다.

(참고 개념: https://hackingisly.tistory.com/32?category=775036)

 

삽입 url: https://xss-game.appspot.com/level6/frame#hTtps://www.google.com/jsapi?callback=alert

 

<참고 : 다른 풀이 방법>

Data Url Scheme

데이터를 url 표현으로 바꾸어주는 것으로, 사용 방법은 data:[자료타입],[데이터]이다.
문제 설명에서 javascript의 라이브러리 동적 로드 기능을 소개하고 있기 때문에, 자료 타입을 text/javascript로 하여,

텍스트 파일을 하나 생성한다.

사용방법에 따라 url을 작성해 보면 data:text/javascript,alert('1');

 

 


#뒤의 경로가 로드된 스크립트의 URL에 영향을 준다는 것을 바탕으로 data url scheme을 반영해 링크를 변경해 주면 다음과 같다.