크로스 사이트 스크립팅(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=''><script>alert(123)</script><''>
다음은 대표적 링크삽입 공격입니다.
<?php
$_GET['link'] = "'<script>malicious code</script>'";
?>
<a href="http://test.com/list.cgi?clientprofile=%3C?=$_GET[" link="">>Click here</a>