크로스 사이트 스크립팅(cross-site scripting, 영문 약어 XSS)은 웹 페이지에 클라이언트 사이드 스크립트를 삽입하여 다른 사용자가 이를 실행하게끔 허용하는 취약점으로, 웹에서 사용되는 대표적 스크립트 언어로 자바스크립트, VB스크립트가 있습니다.

이 취약점은 사용자로부터 입력 받은 값을 제대로된 검사를 하지 않고 그대로 사용할 경우 나타나는데, 주로 사용자의 정보(GET, POST, COOKIE, SESSION 등)를 탈취하기 위하여 특수 문자나 예약어, 스크립트를 나타내는 (, ), !, @, {, }, \n, \t, \0, ', " , > , < , % , $ 등의 문자를 이용합니다.

공격 대상 웹사이트에 삽입한 스크립트를 이용하여 다른 웹사이트로 접근하는 것도 가능하기 때문에 사이트 간 스크립팅이라고 합니다.

매월 크로스 사이트 스크립팅 공격이 상용 사이트에서 발생하고 그러한 위험성을 설명하는 경고문이 발표된다고 합니다. 주의하지 않는 다면 여러분의 웹 사이트나 회사도 이러한 공격의 희생양이 될 것입니다.


웹사이트 공격

크로스 사이트 스크립팅으로 인해 다음과 같은 위험에 빠지게 됩니다.

웹 사이트상의 애플리케이션이 크로스 사이트 스크립팅에 취약하다고 알려지면 공격자는 공격 목표의 권한을 사용하여 실행할 수 있도록 JavaScript, VBScript, ActiveX, HTML, Flash를 투입하는 것입니다. 공격이 활성화 되면 계정 하이재킹, 사용자 설정 변경, 쿠키 훔치기 및 오염, 오류 광고 등이 가능하게 됩니다.

공격자는 사용자 세션, 쿠키가 종료되기 전에 사용자 세션을 인계 받을 수 있으며, 공격자가 제공한 URL로 사용자가 접근할 수 있도록 할 수 있는 침입자는 공격자가 선택한 스크립트나 HTML이 사용자 브라우저에서 실행될 수 있도록 할 수 있고, 이러한 기술을 사용하여 공격자는 URL로 접근했던 사용자의 권한을 사용하여 액션을 취할 수 있습니다. SQL 데이터베이스에 쿼리를 실행하거나 결과를 보고 목표 시스템 구현의 오류를 악용할 수도 있습니다.

공격 샘플 다음과 같이 제대로 된 검사를 하지 않는다면, 공격자는 얼마든지 공격삽입이 가능합니다.

<?php  
 $search = "'><script>alert(123)</script><'";   
 ?> 
 <input value="<?=$search?>" />

위와 같이 필터를 거치지 않는 다면 다음과 같은 결과를 만들어 냅니다.

<input ~~ value=' '><script>alert(123)</script><' '>

필터를 처리하기 위해 다음과 같이 한줄 코드를 삽입하여 공격을 회피할 수 있습니다.

<?php  
 $search = "'><script>alert(123)</script><'";   
 ?>
 <input value="<?=htmlspecialchars($search)?>" /> 

다음은 필터 처리된 모습니다.

<input ~~ value=''&gt;&lt;script&gt;alert(123)&lt;/script&gt;&lt;''>

다음은 대표적 링크삽입 공격입니다.

<?php  
 $_GET['link'] = "'<script>malicious code</script>'";   
 ?>
<a href="http://test.com/list.cgi?clientprofile=%3C?=$_GET[" link="">>Click here</a> 

이 역시 다음 코드 한줄로 필터가 가능합니다.

<?php  
 $_GET['link'] = "'<script>malicious code</script>'";   
 ?> 
 <a href="http://test.com/list.cgi?clientprofile=%3C?=urlencode($_GET[" link="">>Click here</a>

결과 모습입니다.

<a href="http://test.com/list.cgi?clientprofile=%27%3CSCRIPT%3Emalicious+code%3C%2FSCRIPT%3E%27">Click here</a>

이러한 접근 방식의 기초는 사용자 input 나 link 를 절대 신뢰하지 말고 HTML 스팩에서 정의된 메타문자("특수" 문자)를 언제나 필터링 하여 스크립트를 보호하는 것입니다.

 그리고 쿠키나 세션으로 데이터를 구울때 중요 데이터인 경우 암호화하여 혹여나 데이터 유출시 쉽게 알아보지 못하게 해둘 필요가 있어 암호화기법도 중요합니다.

0 댓글