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 좋은진호

댓글을 달아 주세요

  1. 예전에 보안장비 취급하던 회사에 근무하던 시절, 한창 XSS에 대한 이유가 많았는데 이건 좀 생소하네요.

    --
    어젠 좋은진호님과 차한잔 하고 싶다는 뚱딴지같이 생각이 드는 거 있죠.

    2009.03.12 09:16 [ ADDR : EDIT/ DEL : REPLY ]
    • XAS, XRS는 그다지 신경쓰지 않아서, 간단히 정리했습니다.


      덧 : 뚱딴지 같긴요. 차 마시는 것 좋아라 합니다. 제가 워낙 이동지역이 넓은 터라 사람 만나는게 쉽지가 않터라구요. ^^

      2009.03.12 19:19 신고 [ ADDR : EDIT/ DEL ]
  2. 보안의 중요성은 인식하지만 방어적인 프로그래밍을 하는 것은 너무 어려워요.ㅡㅠ

    2009.03.15 22:29 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 사례를 직접 접하면 쉽게 와~닿을 수 있을 것 같아요. '저렇게 하면 안되는구나~~'라고 금방 인식도 하고, 적용도 가능할 듯. 아쉬운거라면, 개발 시간에 쫓기다보니 문제가 생기는 경우가.. ㅠ.ㅠ

      2009.03.16 13:01 신고 [ ADDR : EDIT/ DEL ]