Haekt‘s log

[Dreamhack] XSS-1 writeup 본문

Dreamhack/web

[Dreamhack] XSS-1 writeup

Haekt 2022. 10. 18. 16:10

XSS 문제이다.

FLAG 변수 안의 정답을 찾으면 된다. 

주어진 것은 사이트의 url과 python 파일이 주어졌다. 


탐색-

 

일단 사이트에 들어가 보자. 

vuln(xss) page 란 버튼과 memo  , flag 버튼이 보인다. 순서대로 눌러보자.

 

먼저 vuln 버튼은 

눌렀을 때 url 에 스크립트가 그대로 노출되어 나오며 알림창이 뜬다. 

저런 결과로 봤을때, url 에서 스크립트를 실행할 수 있을 것 같다.

 

변조를 한번 해 보자 

 

url 에 스크립트 삽입이 가능하다는 것을 알았다 .

 

memo 버튼은 

변수와 값이 그대로 노출되며, 아래에 출력되고 저장된다. 

 

url 의 변수의 값을 변조해보자.

변조가 가능하다.

어떻게 저장되는지 확인하기 위해 F12를 눌러 개발자 코드를 확인해보자. 

flag 페이지의 개발자 코드이다. param 이라는 이름으로 post 전송 하는 것을 알 수 있다.

 


이번엔 문제에서 주어지는 python 파일을 직접 살펴보자. 

read_url 의 함수에서 url , cookie 를 인자로 가진다.

쿠키의 domain 값을 127.0.0.1 로 변경한다. 우리의 환경이 아닌 피해자의 환경을 가상으로 설정하기 위함인듯하다.

 

driver.add_cookie(cookie) 를 보면 함수의 인자를 쿠키에 저장하는 코드를 볼수 있다 . 무사히 저장될 경우 true 를 안될경우 false 를 반환한다.

 

check_xss 함수에서 param 과 cookie 의 값을 인자로 가진다.  내가 작성한 param변수의 값을  Url 변수에 저장하고, 

read_url 함수에 url 과 flag 함수에서 온 쿠키값을 반환 한다.

 

flag 함수에서는 get, 이냐 post 이냐에 따라 값을 다르게 하는데 이 사이트는 post 이므로 post 를 보자.

param 이라는 이름으로 전달된 값을 받아내어 param 변수에 저장 그 후 param 과 flag 라는 이름의  flag 값을 check_xss 함수에 전달한다. 

 

제대로 전달 되었을 경우 good 를, 아닐경우에는 wrong를 alert 한다.

memo 라는 함수에서는 

memo_text 전역변수를 선언하고, memo 라는 부분의 값을 받아와 text 변수에 저장한다. 그 후 memo_text += text  + "\n" 을 해서 

memo_text 변수를 render_template 함수를 이용해 memo.html 페이지를 렌더링 한 후 출력한다.

 

많이 어렵지만 이 메모부분을 이용하면 된다. 

 

위의 분석을 정리해 보자면 

이 페이지의 부분에 뭔가를 입력하면 그 값이 먼저 flag 함수에 post 로 전달되고, 그걸 param 에 저장하여 flag 값이 담긴 쿠키와 함께 

check_xss 에 param=param , cookie = flag 로 전달하고,  check_xss 에서는 피해자의 주소와 함께 param 의 값을 더해 url 변수에 담고, 또 그걸 read_url 에 전달하였음. read url 은 받은 url 을 통해 피해자의 가상 클라이언트에 전달함. 

memo 는 피해자 가상 클라이언트에서 memo 를 뽑아와 렌더링하고 출력함.

 

쿠키에 flag 값이 담겼지만 실제로 쿠키가 저장되는건 피해자의 클라이언트 쪽 이므로 우리가 보기는 힘듬.

따라서 상대의 쿠키값을 불러올수 있는 부분이 필요한데 상대의 memo 값을 불러오는 memo코드를 이용하면 볼 수 있다.

 

flag 페이지의 빈칸을 url 로 사용하여 피해자의 클라이언트에 정보를 전달하므로 url 조작을 통해 쿠키의 flag 값을 memo에 저장시킨 후 memo 를 출력한 memo 페이지를 확인하면 flag 값을 확인할 수 있을 것이다.

 

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

무사히 전달된 것을 확인해 볼 수 있다.

 

memo 를 확인해 보자

 플래그가 정상적으로 출력된 것을 볼 수 있다.

Comments