DESC

내가 보려고 쓰는 블로그

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
-
Yesterday
-
Total
-
  • lucy-xss-servlet-filter 로 크로스사이트 스크립팅 공격 예방하기
    ETC./인증 심사 2020. 8. 5. 15:47
    반응형

    네이버에서 이전에 개발되었던 lucy-xss-filter 라는 라이브러리로 기본적인 크로스사이트 스크립팅 방지 문자들을 치환하기는 유용했으나 일일히 치환로직을 추가해야했기 때문에 조치가 누락되는 경우가 자주 발생하며, 또한 공통함수에 적용했을 때 필터링하지 말아야 할 파라미터에 적용되는 등의 단점이 있었다.

    이에 대한 해결책으로 등장한 자바 서블릿 필터 기반의 라이브러리가 바로 lucy-xss-servlet-filter 이다.

     

    참고 ) https://github.com/naver/lucy-xss-servlet-filter

     

    naver/lucy-xss-servlet-filter

    Contribute to naver/lucy-xss-servlet-filter development by creating an account on GitHub.

    github.com

     

    • 장점
      1. XML 설정 만으로 XSS 방어가 가능해짐
      2. 비지니스 레이어의 코드 수정이 발생하지 않음
      3. 개발자가 XSS 방어를 신경 쓰지 않아도 됨
      4. XSS 방어가 누락되지 않음
      5. 설정 파일 하나로 XSS 방어절차가 파악됨

     

    • pom.xml dependency 추가

       

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

     

    • web.xml filter mapping 선언
    <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>

     

    • rule 추가/resources/lucy-xss-servlet-filter-rule.xml 경로에 파일생성 후 작성
      아래는 기본 세팅이고 특수 정책이 있는경우 defender를 사용하여 예외처리를 할 수 있다.
      global 필터링 룰의 경우 예외처리할 파라미터가 없을 시 생략한다.
    <?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>
      
    </config>

     

    이렇게 설정만 하면 request 를 통해 전송되는 파라미터들에 공통적으로 필터가 먹히게 된다 !

    서블릿 필터 라이브러리에는 기본 XSS 필터 클래스들도 포함되어 있기 때문에 추가로 문자열 치환이 필요한 경우 라이브러리에서 제공하는 함수들을 활용할 수 있다.

    public void testXssPreventer() {
      String dirty = "\"><script>alert('xss');</script>";
      
      String clean = XssPreventer.escape(dirty); // => "&quot;&gt;&lt;script&gt;alert(&#39xss&#39);&lt;/script&gt;"
    
      dirty = XssPreventer.unescape(clean); // => "\"><script>alert('xss');</script>"
    }

     

    참고 ) https://github.com/naver/lucy-xss-filter

     

    naver/lucy-xss-filter

    Contribute to naver/lucy-xss-filter development by creating an account on GitHub.

    github.com

     

    그리고 가장 중요한 주의할 점!

    lucy 의 필터링은 서블릿 설정으로 적용을 했기 때문에 form-data에 대해서만 적용되고 Request Raw Body로 넘어가는 JSON에 대해서는 처리해주지 않는다는 단점이 있다.

    참고 ) Spring에서 JSON에 XSS 방지 처리 하기

     

    HomoEfficio/dev-tips

    개발하다 마주쳤던 작은 문제들과 해결 방법 정리. Contribute to HomoEfficio/dev-tips development by creating an account on GitHub.

    github.com

     

    ajax 를 활용하여 json 방식의 호출을 많이 사용해야하는데 이를 수동으로 처리하기에는 무리가 있었다.

    아래와 같이 화면에서 jsp 태그 혹은 el 태그로 변수를 출력하는경우 조작된 스크립트가 바로 실행될 수 있는 심각한 위험성이 있다.

    <p>이름 : ${username}</p>
    <p>연락처 : ${mobile}</p>
    <p>주소 : <%=address %></p>

     

    위의 참고링크처럼 정확하게 서버단에서 조치하는것이 확실한 방법이긴 하나, 사실 너무 복잡했다.

    가장 단순한 방법을 찾아보려다가 jstl 라이브러리를 활용하는 방법을 선택했다. jstl의 core라이브러리를 사용하면 <,> 등의 특수문자가 기본적으로 치환되기 때문에 우선 스크립트는 실행이 되지 않는다! 하지만 XML 태그만 치환되는 부분으로 완벽하지 않을 수 있다.

    <!-- 최 상단에 태그라이브러리 선언 -->
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    
    <!-- HTML Body -->
    <p>이름 : <c:out value="${username}"/></p>
    <p>연락처 : <c:out value="${mobile}"/></p>
    <p>주소 : <c:out value="${address}"/></p>

     

    만약 jstl 라이브러리 중 functions 라이브러리도 사용하고 있다면 c:out 태그를 감싸지 않고 함수를 활용할 수 있다.

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    <p>연락처 : ${not empty mobile? fn:escapeXml(mobile) : '02-1234-1234'}</p>

     

    여기까지 조치했을때에는 모의해킹 취약점 점검은 모두 통과 !

     

     

     

    반응형

    댓글

Customed By Hailey Gong.