IT이야기2009. 3. 9. 23:53
웹프로그래밍을 할 때, 웹브라우저명(Agent)이나 레퍼러(Referer) 정보를 화면에 출력할 경우가 있다. Request header의 웹브라우저명, 레퍼러를 누구나 쉽게 변경(위조)가 가능하다는 것을 알면서도 특별한 조치없이 바로 echo하는 경우가 많다. 일반적인 브라우저명이라면 다음과 같은 형식이다. 그대로 echo한다고 해도 문제가 되지 않을 것이다. 

Mozilla/5.0 (X11; U; Linux i686; ko; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4

그러나 다음과 같이, 브라우저명에 자바스크립트 등의 코드를 넣은다면 상황은 달라질 것이다. 피해는 XSS나 XSRF에 비해 미비할 수도 있겠지만 악의적인 임의의 자바스크립트를 실행할 수 있다.

<script>alert('hello')</script>

브라우저명에 실행가능한 형태의 코드나 자바스크립트를 넣는 것을 XAS(Cross Agent Scripting)라고 하며,
레퍼러에 넣는 것을 XRS(Cross Referer Scripting)이라고 부른다.

레퍼러를 변경해서 테스트해보자. FireFox에는 레퍼러를 변경할 수 있는 'RefControl' Addon( http://addons.mozilla.org/ko/firefox/addon/953 )이 있다. 설치 후 도구 -> RefControl Options -> Add Site 를 클릭한다.

RefControl

( Firefox RefControl Addon에서 Referer를 사용자가 설정하는 화면 )



단순히 <? echo $_SERVER['HTTP_REFERER']; ?>만 되어 있는 페이지의 경우 다음과 같이 자바스크립트가 실행되는 것을 확인할 수 있다.
XRS 임시 테스트 화면

( XRS 테스트 결과. 이 페이지는 테스트를 위해 임시로 만듬. 실제 존재하지 않음 )



XAS, XRS를 막기위해서 php의 경우 htmlspecialchars() 함수 등으로 특수문자(<, > 등)를 변환해야 한다.

[ 좋지 않은 php 코드 ]
<?
echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['HTTP_REFERER'];
?>

[ 안전한 형태의 php 코드 ]
<?
echo htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
echo htmlspecialchars($_SERVER['HTTP_REFERER']);
?>

※ XSS(Cross Site Scripting), CSRF/XSRF(Cross Site Request Forgery)에 대한 한글 문서는 많으나 XAS, XRS에 대한 글은 거의 없어 정리했다.

Posted by 좋은진호