본문 바로가기
Stack Overflow/스프링

XSS(Cross-Site Scripting) 인젝션 취약점 공격 스프링 패치 방법 - Naver Lucy

by Lich King 2023. 10. 13.

XSS(Cross-Site Scripting) 인젝션 공격은 블라인드 SQL 인젝션과 동일하게 보안등급 상 매운 높은 심각도로 분류된다.
따라서 웹 서비스를 운영할 떄 이 점을 고려해야하는데 소스단계에서 처리하기가 매우 골치 아프다.
이를 소스로 처리하기에는 방패와 같아서 매일 다르게 새로운 공격방법이 나와 보안이 뚫리기 일쑤다.
그래서 대부분의 기업은 위험한 문자 인젝션에서 사용 가능한 솔루션을 검토하여 도입하기도 한다.

이 XSS 인젝션 공격의 원인은 "사용자 입력 파라미터 값에서 문자를 올바르게 필터링하지 못함"으로 볼 수 있다.
따라서 파라미터에 합법적인 사용자로 위장하는 데 사용될 수 있는 고객 세션 및 쿠키를 빼내거나 조작하는 것이 가능하여 해커가 사용자 레코드를 보거나 변경할 수 있으며 해당 사용자처럼 트랜잭션을 수행할 수 있다. 
이는 XSS(Cross-Site Scripting) 공격에서 사용되어 정보를 일부 추출할 수 있다.
브라우저 콘솔이나 URL로 자바스크립트 코드를 주입하여 브라우저에 실행하는 방법 등이다.

이를 막기 위해 큰 노력을 필요로 하는데 개인 사용자 단계에서 적은 노력으로 어느정도 보완할 수 있는 방법이 있다.
나는 스프링에 적용하는 방법을 간략히 서술하려고 하며, 더 나은 방법이 있을 수 있음을 미리 말씀드린다. 
네이버에서 개발한 Lucy를 스프링에 적용해보려 한다.

 

레포지토리 링크 : https://mvnrepository.com/artifact/com.navercorp.lucy
GITHUB : https://github.com/naver/lucy-xss-servlet-filter



1. pom.xml

<dependency>
   <groupId>com.navercorp.lucy</groupId>
   <artifactId>lucy-xss-servlet</artifactId>
   <version>2.0.1</version>
</dependency>

GITHUB에서는 2.0.0으로 명시되어 있으나, 2.0.1이 최신이므로 수정해서 작성한다.
pom.xml에 적용하지 않고 라이브러리를 추가하길 원한다면, 하기의 레포지토리 사이트에서 라이브러리 2개를 내려받아 빌드에 추가하도록 한다.

링크 : https://mvnrepository.com/artifact/com.navercorp.lucy

파일1 :lucy-xss-1.6.3.jar
파일2 : lucy-xss-servlet-2.0.1.jar

 

2. web.xml

<filter>
   <filter-name>xssEscapeServletFilter</filter-name>
   <filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>xssEscapeServletFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

SSL 필터 다음에 명시하면 된다.

 

3. lucy-xss-servlet-filter-rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.navercorp.com/lucy-xss-servlet">
   <defenders>
       <!-- XssPreventer 등록 -->
       <defender>
           <name>xssPreventerDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class>
       </defender>

       <!-- XssSaxFilter 등록 -->
       <defender>
           <name>xssSaxFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class>
           <init-param>
               <param-value>lucy-xss-sax.xml</param-value>   <!-- lucy-xss-filter의 sax용 설정파일 -->
               <param-value>false</param-value>        <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>

       <!-- XssFilter 등록 -->
       <defender>
           <name>xssFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class>
           <init-param>
               <param-value>lucy-xss.xml</param-value>    <!-- lucy-xss-filter의 dom용 설정파일 -->
               <param-value>false</param-value>         <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>
   </defenders>

    <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. -->
    <default>
        <defender>xssPreventerDefender</defender>
    </default>

    <!-- global 필터링 룰 선언 -->
    <global>
        <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 
                또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <params>
            <param name="globalParameter" useDefender="false" />
            <param name="globalPrefixParameter" usePrefix="true" useDefender="false" />
        </params>
    </global>

    <!-- url 별 필터링 룰 선언 -->
    <!-- 
    <url-rule-set>
       
       url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다.
       <url-rule>
           <url disable="true">/disableUrl1.do</url>
       </url-rule>
       
        url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다.
        <url-rule>
            <url>/url1.do</url>
            <params>
                <param name="url1Parameter" useDefender="false" />
                <param name="url1PrefixParameter" usePrefix="true" useDefender="false" />
            </params>
        </url-rule>
        
        url2 내의 url2Parameter1만 필터링 되지 않으며 url2Parameter2는 xssSaxFilterDefender를 사용해 필터링 한다. 
        <url-rule>
            <url>/url2.do</url>
            <params>
                <param name="url2Parameter1" useDefender="false" />
                <param name="url2Parameter2">
                    <defender>xssSaxFilterDefender</defender>
                </param>
            </params>
        </url-rule>
    </url-rule-set>
     -->
</config>

resource 패키지 아래에 상기의 xml 파일을 삽입하면 된다.

나는 전체 URL에 적용하기 위해 일부 필터를 주석처리 하였다. 네이버 Lucy 라이브러리는 JSON으로 파라미터를 주고받는 경우 <url-rule-set>에서 예외처리를 하도록 하는 것이 시스템 안전성에 좋다.

 

위 라이브러리는 최신 업데이트 된지 수년이 흘러서 현재 기준으로는 다른 방법이 필요로 할 수 도 있다고 생각된다. 업데이트를 할 것이 없는 것인지, 아니면 관리가 안되는 것인지 잘 모르겠다. 

댓글