Dreamhack | XSS-2
Dreamhack XSS-2
본 문제는 Dreamhack을 통해서 풀어 보실 수 있습니다.
해답을 이해하며 생각을 해보면서 풀이 해보시길 바랍니다.
문제 내용
문제는 dreamhack.io를 들어가시면 확인할 수 있습니다.
해당 문제는 드림핵 Cross Site Script 로드맵에 등장하는 두번째 문제로 같은 내용을 담고 있다.
이번에도 접속했을 때 위 처럼 3개의 링크가 존재하는 것을 알 수 있다.
문제 풀이
-
vuln(xss)page : 해당 링크를 접속하면
1이라는 Alert가 뜨는데 해당 URL을 보면http://host3.dreamhack.games:23964/vuln?param=%3Cscript%3Ealert(1)%3C/script%3E로 되어 있다. 하지만, 어떠한 이유인지 스크립트가 작동하지 않는다. -
memo : 접속 시 hello라는 문구가 있다. 재접속을 할 때 마다 한 줄씩 늘어나게 된다.
app.py를 보고 어떤 식인지 확인해보겠습니다.
@app.route("/vuln")
def vuln():
return render_template("vuln.html")
vuln page로 우리가 입력한 값 param을 통해서 return 하는 것이 아닌 일반적인 vuln.html 파일을 return 하고 있다.
이후의 소스 코드는 이전 문제와 같다.
어떠한 이유로 스크립트가 작동하지 않았는지 페이지를 통해서 알아보고자 한다.
<script>
var x=new URLSearchParams(location.search);
document.getElementById('vuln').innerHTML = x.get('param');
</script>
vuln.html 내의 존재하는 script이다. 파라미터로 넣은 값을 받아서 innerHTML를 하게 되는데 단순 Text로 인식하게 되는 것으로 보인다.
그리고, 아래의 document.getElementById('vuln').innerHTML로 어떻게 들어가는지 확인해보겠습니다.
script 앞 < 이 일반적이지 않고 필터링 되어 있는 것을 알 수 있다. 계속해서 값을 변경해서 넣어보니 <만 독립적으로 필터링하는 것이 아닌 <script 까지 완성되면 < 하나만 필터링 되는 것을 알 수 있다.
즉, <script> 태그를 이용할 수 없다는 것을 알고 XSS 우회법을 찾아봤다.
<img src="xss" onerror="alert()">
<iframe src="javascript:alert()">
<a href="javascript:alert(1)">Anything</a>
XSS 필터링 우회, xss cheat sheet에 대해서 검색하게 된다면 더욱 많은 자료가 있습니다.
필터링 방법을 이용해서 vuln 페이지에 parameter를 변경하였더니 XSS가 발생하는 것을 알 수 있었습니다.
이후, 기존 방법과 동일하게 check_xss 함수를 통한 cookie 정보 FLAG를 받아오겠습니다.
<img src="#" onerror="location.href='/memo?memo=' + document.cookie">
해당 페이로드를 전송하고 다시 memo 링크로 들어가면 FLAG가 입력되어 있는 것을 알 수 있다.