HOME
home
CV News
home

Cross-Site-Script #2

속성
WEB
날짜
위는 실무환경에서 마주치게 되는 상황을 예제로 만들어 본 코드이다. 검색창에 XSS라고 입력하고 검색 후 소스코드를 확인해 보면 value값에 내가 입력한 문자열이 기록되어 있음을 확인할 수 있다.
XSS의 기본 구문을 입력 시 <script>alert(1)</script> 아무런 반응이 없다. 먼저 위 스크립트가 동작하는 원리에 대해서 알고 있어야 한다.
alert은 간단하게 팝업창을 노출시키는 함수이고 <script> 영역 안에서 사용할 수 있기 때문에<script>alert(1)</script> 코드를 사용하게 되는 것이다.
동작하지 않는 이유를 살펴 보면 해당 페이지의 소스코드를 자세히 보면 "(더블쿼트)안에 명령문이 들어가있는걸 확인할 수 있다.
"<script>alert(1)</script>" 더블쿼트 안에 있으면 이 스크립트가 명령문이 아니라 문자열로 인식이 되어 동작하지 않는다.
이 문제를 해결하는 방법은 "(더블쿼트)를 하나 더 입력해 문자열로 인식되는 영역을 탈출하고 뒤에 >를 입력 해 input text영역을 빠져나온 후 스크립트를 사용하면 된다.
여기까지 이해가 됬다면 이제 XSS취약점을 발굴할 때 어디서부터 어떻게 찾아야 할지 헤메이지 않아도 된다.
직금부터는 입력해볼 수 있는 모든 입력창과 파라미터에 ">XSS라고 입력 하고 소스코드를 확인 해XSS가 입력된 곳을 찾아 소스코드에서 특수문자가 필터 되었는지 확인만 하면 된다. 특수문자(">)가 필터 되어있지 않다면 해당 페이지는 XSS공격에 매우 취약한 상태인 것이다.
대응 방법은 인터넷에 널려 있지만 간단하게 특수문자를 HTML인코딩 하는 것이다.
특수문자를 HTML인코딩 하게 되면 동작하지는 않지만 화면에 보일때는 입력된 그대로 노출 된다.
ex) > → &lt;
< → &gt;
다음은 일부 특수문자가 필터 되는 상황이다. <script>alert(1)</script>를 입력하고 소스코드를 확인했더니 입력한 값이 HTML인코딩이 되어 있는 상황이다.
코드를 한번 자세히 보자. 다른 특수문자(<, >, /)는 인코딩 되었지만 "(더블쿼트)는 필터가 안된것을 확인할 수 있다. "(더블쿼트)를 사용할 수 있다는 건 내가 입력하는 값이 문자열이 아니라 명령문을 인식 시킬 수 있다는 말이다.
그럼 <script>를 사용할 수 없는 상황에서 어떻게 스크립트를 동작 시킬까?
바로 HTML 이벤트 핸들러를 사용하면 된다.
HTML 이벤트 핸들러는 종류만 80개(?)가 넘어 너무 많으니 잘 찾아보길 바란다.
위 이미지에서 보면 다른 특수문자 없이 "(더블쿼트)만 사용하여 팝업 창을 노출시켰다. 바로 이벤트 핸들러인 onouseover 핸들러를 이용하여 마우스가 text창에 오버되면 alert이 작동하는 방식이다.
그래서 팝업 하나 띄우는 걸로 뭘 어떻게 공격하는가?
보통 쿠키,세션 값 탈취하는 방법도 있지만 위 이미지 처럼 다른 페이지로 리다이렉트 시키는 방법도 사용할 수 있다.