Post

[dreamhack] xss filtering bypass advanced

image

문제는 vuln(xss) page , memo , flag 페이지로 나눠져 있다.

페이지 확인하고 순서대로 해당되는 코드들을 살펴보자.

image

/vuln 페이지이다. 스크립트가 가능하다는 것을 확인할 수 있다.

image

xss_filter 함수이다. 문제를 푸는 데 필요한 주요 단어들을 필터링하고 있다. 해당 단어가 포함되면 “filtered”를 return 한다.

image

xss_filter 함수를 통해 파라미터를 필터링하고 return 한다.

image

/memo 페이지이다.

image

request.args.get을 통해 memo 파라미터를 얻어 render_template으로 출력한다.

image

/flag 페이지이다.

image

GET 요청이 올 때는 flag.html 가 띄워진다.

POST 요청이 올 때는 파라미터 값을 가져와서 변수 param 에 저장하고,

check_xss 함수에 name이 flag이고, value가 FLAG.strip()인 값을 전달한다. 

image

check_xss 함수이다.

전달 받은 param값을 urllib.parse.quote() 함수를 통해 인코딩 한 뒤 url 변수에 넣고 read_url로 전달한다.

image

read_url 함수이다.

driver.get(“http://127.0.0.1:8000/”)을 호출해 로컬 서버에 접속한 후,

driver.add_cookie(cookie)을 통해 설정된 쿠키를 추가하고,

driver.get(url)을 호출해 전달된 URL에 접속한다.

flag 값을 얻기 위해 해야하는 것은, xss_filter를 우회하는 것이다.

코드 해석대로면, /flag 페이지에서 쿠키 값(flag)을 셋팅한 후 /vuln 페이지에 접속하기 때문에

/vuln 페이지에서 /memo를 접속하게한 후 쿠키 값(flag)을 memo 파라미터로 넘기면 /memo 페이지에 flag가 보일 것이다.

먼저, 우회하기 전에 만약 필터링 함수가 없었다면 어떤 값을 입력해야 하는지 생각해보자.

1
<script>location.href="/memo?memo="+document.cookie</script> 

정도로 작성해볼 수 있겠다.

시도해보자.

image

당연히 안된다.

%09(tab)을 이용해 우회해보자. 값이 출력되는지 확인하기 위해 alert 를 사용했다.

image

아. “(“와 “)” 도 필터링된다는 걸 깜빡했다.

image

우회는 된 거 같은데, 실행여부를 확인할 수 없다.

This post is licensed under CC BY 4.0 by the author.