XSS(Cross Site Scripting) 공격과 대비 방법
보안은 웹 개발을 하고 있는 개발자들이 가장 쉽게 지나치게 되는 주제입니다. 오늘은 이 중에서 도 가장 기초적인 부분이라고 할 수 있는 Cross Site Scripting(XSS) 에 대해서 말씀을 드리도록 하겠습니다.
Cross Site Scripting은 사용자에게 입력 받은 악의적인 스크립트를 필터링하지 않고 동적으로 생성된 웹 페이지에 포함하여 사용자에게 재전송할 때 발생됩니다.
JavaScript 처럼 클라이언트에서 실행되는 언어로 작성된 악성 스크립트의 경우 웹 페이지, 웹게시판, 웹 메일에 포함된 채 사용자에게 전달되고, 사용자가 해당 웹 페이지나 게시판을 클릭하여 읽을 경우 실행됩니다.
[공격 대상 언어 및 스크립트]
- JavaScript
- VBScript
- ActiveX
- HTML, Flash
[공격 대상 코드]
- CGI 스크립트
- 검색 엔진
- 게시판
- 오류 페이지
[공격 대상 코드의 주요 공격 위치]
- URL parameter
- Form elements
- 쿠키
- DB 쿼리
만일, 여기까지 읽으시면서 별 문제가 없지 않느냐고 생각하시는 분들이 계시다면, 아래의 공격대상이 된 간단한 예제를 보시기 바랍니다.
Case1. <xmp> 가 입력된 경우
- HTML 의 코드를 실행하지 않고 <xmp> Tag 이하의 코드가 노출되게 됩니다.
Case 2. <SCRIPT>alert("XSS Attack TEST");</SCRIPT> 가 입력된 경우
- <SCRIPT> Tag를 이용하여 위와 같이 특정 코드의 실행이 가능합니다. 만약<script>for(i=1;i<1000;i++){alert(“XSS Attack TEST”)}</script> 을 입력했다면, 사용자는 끊임없이 나타나는 확인창에 당황하게 될 것입니다.
- 물론 해당 코드 자체가 큰 문제가 되지 않을 것이라고 여겨질 수는 있겠지만, 쿠키값 등이 노출되어 보내지는 등 보안에 좀 더 치명적인 형태로 충분히 악용 가능합니다.
그럼 이제 대비책에 대해 말씀 드리겠습니다.
- 기본적으로 “<Script”로 시작되는 문자열을 체크 하거나
- HTML Tag를 사용하지 못하도록 하거나 ( <, >, ( , ) , #, & 등의 Tag를 치환하는 방법)
- 특정 HTML Tag만을 허용하도록 하거나
- 전달되는 Parameter 에 대해 항상 무결성 체크를 하거나
- 페이지 에러시 공통적인 알림 페이지로 하거나
등과 같은 방법으로 간단하게 대비할 수 있습니다.
개발 일정이 촉박하여 Flow 개발에만 신경을 쓰다가 자칫 소홀해지기 쉬운 보안 부분에 대해서
위와 같이 작은 부분에서부터 신경을 쓰는 것이 어떨까 하는 생각으로 글을 썼습니다.
웹 개발시 Sql-Injection / Command-Injection등 안전한 웹 프로그래밍을 위한 여러 부분들을 좀더 고려하면 더욱 좋을 것입니다.

