
XSS Filtering Bypass 문제의 Advanced 버젼이다.
문제 풀이

서버에 들어가면 3개의 페이지가 있다.

/vuln 페이지이다. <img src> 스크립트 사용이 가능하다는 것을 보여준다.

/vuln 소스코드다.
param의 파라미터 값을 받아서 xss_filter에 넘겨준다.

xss_filter 함수이다.
여러 가지 스크립트에 활용할 수 있는 문자열들을 필터링하고 있다.
필터링 할 문자들을 없애는 방식이 아니라 "filtered"를 띄워버린다.

/memo 페이지이다.

get으로 memo 파라미터 값을 출력해준다.

/flag 페이지이다.

소스코드를 해석해보면
GET 요청이 왔을 때는 flag.html을 띄워주고, POST 요청이 왔을 때는 param 값을 가져와서 param이라는 변수에 저장하고,
name이 flag이고, value가 FLAG.strip()인 값을 check_xss 함수에 전달한다.
아마 flag의 value가 이 문제의 FLAG로 추측된다.
strip() 함수는 양 사이드의 공백을 제거한다.

check_xss 함수이다. /flag 에서 받은 param과 FLAG.strip()을 각각 param, cookie에 저장한다.
전달받은 param 값으로 /vuln 페이지에 param이라는 파라미터 값에 urllib.parse.quote() 함수를 사용해 param 값을 url 인코딩 한 뒤
get 요청을 보내는 url을 만들어 url 이라는 이름의 변수에 저장한 후, read_url 함수에 생성한 url과 cookie값을 전달한다.

read_url 함수이다.
url과 cookie를 전달받고, driver.add_cookie 함수로 cookie 값으로 쿠키를 추가한다.
>> xss_filter 함수를 우회해서 /memo 페이지에 document.cookie 값을 전달해야 한다!

많은 키워드들이 필터링되고 있다.
<script>location.href="/memo"+document.cookie</script> 를 어떤 방식으로든 실행시키면 된다.

iframe을 사용해서 <iframe src = "javasc%09ript:alert`1`">을 해보니까 된다.
메모에 document.cookie를 보내면 되니까 <iframe src = "javasc%09ript:locatio%09n.href='/memo?memo='+docu%09ment.cookie"> 를 보내면 될 것 같다.

post 방식이니까 %09 대신 탭으로 바꿔서 넣는다.
<iframe src = "javasc ript:locatio n.href='/memo?memo='+docu ment.cookie">


https://dreamhack.io/wargame/challenges/434
XSS Filtering Bypass Advanced
Description Exercise: XSS Filtering Bypass의 패치된 문제입니다. 문제 수정 내역 2023.08.04 Dockerfile 제공
dreamhack.io