DreamHack

XSS-1

흑조롱이 2024. 2. 5. 07:53

https://dreamhack.io/wargame/challenges/28

 

xss-1

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다. 문제 수정 내역

dreamhack.io

 

 

 

문제 개요

 

웹사이트에서 임의의 자바스크립트 코드를 실행할 수 있는 XSS 취약점을 활용하여, 플래그를 얻는 것이 목표인 문제이다.

 

 

 

Flag 위치

 

 

 

 

"/flag" 엔드포인트는 GET request가 오면 "flag.html"을 렌더링 한다.

 

하지만 POST request가 오면 "check_xss" 함수를 실행하고, 그 결과 별로 다른  자바스크립트 코드를 실행한다.

 

"check_xss" 함수를 실행할 때, 인자로 flag를 준다. 

 

 

 

 

 

"check_xss" 함수는 "read_url" 함수를 실행함과 동시에, flag를 같이 넘겨준다.

 

 

 

 

함수 "read_url"은 "check_xss" 로부터 받은 flag의 값을 부라우저의 쿠키에 저장하는 역할을 한다.

 

 

따라서, 이 문제의 flag는 쿠키에 들어있다는 점을 알 수 있다.

 

 

취약점 분석

 

 

 

 

"/memo" 엔드포인트는 "render_template" 함수를 이용하여. 인자 "memo"의 값을 화면에 표시하는 역할을 한다.

 

 

 

 

 

"render_template" 함수는 인자들을 string 형식으로 인식하므로, "/memo" 엔드포인드에서 바로 XSS 취약점을 이용하기에는 어렵다.

 

 

 

 

 

"/vuln" 엔드포인트는 인자 "param"의 값을 검증없이 받은 다음, 페이지에 표시 한다. 

 

 

 

 

 

"/vuln" 엔드포인트에서 발생하는 XSS 취약점을 활용하면, 웹사이트의 쿠키에 들어있는 Flag를 얻을 수 있을 것이다.  

 

 

 

Exploit

 

 

"/flag" 엔드포인트에서 "/memo"에 쿠키를 출력하는 자바스크립트 코드를 적어넣으면, 이 문제의 flag인 쿠키를 확인할 수 있다.

 

 

<script>location.href="/memo?memo="+document.cookie;</script>

 

 

 

위의 코드는 브라우저의 쿠키를 "/memo" 엔드포인트의 인자 "memo"에 저장하는 역할을 한다.

 

그러면 인자 "memo"에 저장된 쿠키 겸 flag는 "/memo" 페이지에서 볼 수 있다.

 

 

 

 

 

위의 코드를 실행하면, 이 문제의 flag를 얻을 수 있다.