XSS-1
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를 얻을 수 있다.