총 3개의 페이지가 있으며, 각 페이지 별로 기능이 있다.
1. vuln: XSS 공격을 날릴 수 있는 페이지이다. param에 자바스크립트를 적으면 그대로 실행시킨다.
2. memo: 메모 페이지이다. memo 파라미터에 입력한 값을 저장하고 출력한다.
3. flag: flag를 얻기 위한 페이지이다.
app.py 코드를 살펴보면 flag 페이지에서 요청을 보낼 때, 쿠키에 flag를 담고 셀레니움을 통해 vuln 페이지로 접근한다. 따라서 다음 코드로 쿠키에 접근하여 memo 페이지에 flag를 담으면 된다.
<script>location.href = `/memo?memo=${document.cookie}`;</script>
XSS-1 문제와 완전히 똑같은 구조지만, <script> 태그를 이용하면 flag를 얻을 수 없다.
그 이유는 vuln.html에 있는 innerHTML 때문인데, innerHTML 안에 삽입된 <script> 태그는 실행되지 않기 때문에 이걸로는 공격할 수 없다. 하지만 더 알아보면, <script> 태그 없이도 innerHTML에서 JavaScript를 실행할 수 있는 방법이 있다.
MDN Web Docs - innerHTML
위 링크에서 보면
const name = "<img src='x' onerror='alert(1)'>";
el.innerHTML = name; // shows the alert
아래와 같이 img 태그에서 이미지를 불러오지 못했을 때 실행하는 onerror에 적힌 스크립트는 그대로 실행이 된다.
<img src="x" onerror='location.href = "/memo?memo="+document.cookie'/>
flag 페이지에 이 코드를 입력하면 flag를 획득할 수 있다.