본문 바로가기
Web Security/SecureCoding

XSS와 lucy xss Sax filter

by KkingKkang 2024. 1. 19.

XSS란?

  • Cross-site Scripting
  •  악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법 
  • 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며,
    보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취
  • 자바스크립트를 사용하여 공격하는 경우가 많음 
  • Text-Only 게시판 등에서는 XSS가 발생하는 경우는 없다
  • Stored XSS 
    • 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식
  • Reflected XSS
    • URL 파라미터(특히 GET방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식
    • 브라우저 자체에서 차단하는 경우가 많아 상대적으로 공격을 성공시키기 어려움
  • 방어 방법
    • XSS는 데이터를 입출력 할 때 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋다
    • 자바는 XSS필터를 만든 뒤 web.xml에 선언하여 모든 파라미터가 해당 필터를 거치도록 하는 것만으로도 효과를 볼 수 있다 
    • 필터 제작 시 < 는 &lt , > 는 &gt 처럼 HTML 문자로 바꾸어 사용 
  • 사용할만한 라이브러리  : OWASP Antisamy, NAVER Lucy XSS Filter, ESAPI 등

 

Lucy Xss Filter

  • XSS공격을 방어하는 JAVA 라이브러리
  • 화이트 리스트(White List) 설정 방식 
    • 화이트 리스트란 ? > 기본 정책이 모두 차단인 상황에서 예외적으로 접근이 가능한 대상을 지정하는 방식
  • 규칙을 선언한 XML 파일의 상속, 오버라이딩 가능
  • 보안 정책을 정하는 부서에서 상위 설정 파일을 제공하고 서비스별로 필요한 정책을 하위 선언 파일에 기술하는 방식으로 사용 가능
  • 메모리를 효율적으로 쓰는 SAX방식의 HTML 파싱 모듈 제공 
    • SAX(Simple API for XML) 
      • XML 문서를 순차적으로 읽어들이면서 노드가 열리고 닫히는 과정에서 이벤트 발생 
      • 문서 일부의 임의 접근은 불가하지만 적은 메모리나 빠른 처리를 요하는 경우 적합함.
      • 발생한 이벤트를 핸들링하여 변수에 저장, 활용 하는 것이므로 복잡하고 노드 수정이 어려움

 

Lucy XSS Filter는 Maven Central Repository에 배포되어 있다. 

1. pom.xml 의존성 설정

<dependency>
    <groupId>com.navercrop.lucy</groupId>
    <artifactId>lucy-xss</artifactId>
    <version>X.X.X</version>
</dependency>

 

2. XssFilter - SAX방식

  • HTML 요소를 허용하되 XSS 공격에 위험한 요소를 걸러내야 할 때 사용
  • HTML이 허용되는 게시판의 본문 등에 적용할 수 있음
  • DOM 트리 생성 과정 및 부모 자식 간의 검사가 생략되어 DOM 방식에 비해 속도가 약 20% 빠름
  • 특히 중첩된 태그가 많은 인풋일수록 SAX방식에서 큰 속도 향상이 있음
  • lucy-xss-superseet-sax.xml 작성
  • lucy-xss-sax.xml 작성
  • 모든 설정 파일 작성 후 클래스패스의 최상위 경로에 저장
  • 특정 설정 파일을 명시할때는 .getInstance(String)을 사용한다
  • 문자열 필터링은 doFilter(String) 메서드를 활용한다
  • 공격패턴 검출시 디버그를 위해 추가되는 주석문을 표시하지 않기 위해서는 true 추가 
LucyXssFilter filter = XssSaxFilter.getInstance("lucy-xss-sax.xml");

XssSaxFilter filterNoComment = XssSaxFilter.getInstance(true);

XssSaxFilter otherFilterNoComment = XssSaxFilter.getInstance("lucy-xss-sax.xml", true);


String clean = filter.doFilter(String dirty);

String otherClean = filter.doFilter(char[]dirty, int offset, int count, Writer writer)
/* XSS코드가 포함된 문자열을 char[]로 받아
신뢰할 수 있는 코드로 변환하거나 삭제한 후
결과물을 인자로 받은 writer객체에 write한다
즉, 외부에서 writer를 제어할 수 있는 인터페이스 제공 */ 

String doFilter(String tagName, String attName, String dirtyAttValue)
/* 특정 HTML 요소 내의 속성값으로 삽입되는 XSS 코드를 신뢰할 수 있는 코드로 변환하거나 삭제 */

 

3. XssSaxFilter

<config xmlns="http://www.nhncrop.com/lucy-xss" extends="lucy-xss-superset-sax.xml"> 
<!--xmlns : 디폴트 네임스페이스 
	extends : 상속 받을 설정 파일 이름 
-->
	<elementRule></elementRule> <!--적용 가능한 모든 요소에 대한 필터링 규칙 설정-->
    <attributeRule></attributeRule> <!-- 적용 가능한 모든 속성에 대한 필터링 규칙 설정 -->
</config>

 

elementRule 

<elementRule> <!-- 하나 이상의 element 요소로 정의되며, element 필터링 규칙에 없는 요소는 필터링 대상이 된다 -->

	<element name="a" override="true" disable="false">
    <!-- element : 하나의 요소에 대한 필터링 규칙을 설정 
    	name : 요소 이름
        override : 'extends'속성에 기술한 상위 설정 파일에 동일한 설정이 있으면 그 설정을 상속받을지 설정. 디폴트 true 
        disable : name에 설정된 요소를 elementRule에서 제거할지 설정. 디폴트는 false -->
        
         
         <listener>com.nhncorp.security.xss.XXXListener</listener>
         <!-- lestener : 이 화이트리스트 설정 파일의 설정만으로 해당 요소를 필터링할 수 없는 경우, 
         com.nhncrop.lucy.security.xss.event.ElementListener 인터페이스를 상속하여 구현한 클래스 이름 입력 -->
     
     </element>
</elementRule>

 

attributeRule

<attributeRule> <!-- attributeRuel : 하나 이상의 하위 attribute 태그를 가지는 부모 태그 -->

	<attribute name="class" override="true" disable="false" base64Decoding="true">
    <!--attribute : 하나의 속성에 대한 필터링 규칙 설정
    	name : 속성 이름
        override : config의 'extends' 속성에 설정한 상위 설정 파일에 동일한 설정이 있으면 그 설정을 상속받을지를 결정. 디폴트 true 
        disable : name에 설정된 속성을 attributeRule 에서 제거할지 설정. 디폴트는 flase
        base64Decoding : 속성 값에 필터링 규칙을 적용하기 전에 base64 디코딩 수행 여부를 설정. 디폴트는 false -->
        
        	<allowedPattern><![CDATA[ ]]></allowedPattern>
            <!--allowedPattern : 속성값으로 허용되는 정규 표현식 (regular expression)을 입력. 
            패턴에 해당되지 않는 모든 속성 값은 필터링된다. -->
            <!--혹은-->
            <notAllowedPattern><![CDATA[ ]]></notAllowedPattern>
            <!--notAllowedPattern : 속성 값으로 허용되지 않는 정규 표현식을 입력.
            패턴에 해당되는 모든 속성 값은 필터링됨. -->
            
    </attribute>
</attributeRule>

 

참고 : https://naver.github.io/lucy-xss-filter/kr/

 

Lucy XSS Filter

XSS 공격이 가능한 HTML 요소를 신뢰할 수 있는 코드로 변환하거나 삭제하는 기능을 제공한다. 공격이 가능하지 않은 HTML 요소는 허용을 한다. 4.1. 설정 파일 Lucy-XSS Filter의 필터링 규칙은 화이트리

naver.github.io

 

반응형

댓글