본문 바로가기

카테고리 없음

[dreamhack] XSS Filtering Bypass Advanced

728x90

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

 

728x90