새소식

반응형
Java/Spring Boot

Spring Boot XSS Filter 설정(lucy-xss-servlet-filter)

  • -
728x90
반응형

XSS 란?

Cross Site Scripting 의 줄임말로 XSS의 약어이다.

원래는 CSS가 맞지만 이미 CSS 라는 스타일 시트(.css) 가 사용되고 있어 XSS라고 칭한다.

 

XSS 공격이란?

크로스 사이트 스크립팅의 뜻처럼 사이트 간 스크립팅 이라는 이름의 웹 취약점이다.

웹 사이트의 관리자가 아닌 제 3자가 악의적인 목적을 가지고 악성 스크립트를 삽입하여

의도하지 않은 명령을 실행시키거나 쿠키, 세션 등을 탈취할 수 있는 취약점이다.

 

예를 들어 게시판의 글을 작성할 때 작성 내용 안에 아래와 같은 문장을 삽입한다.

<script>alert(document.cookie)</script>

그럼 DB 데이터에 위와 같은 내용이 삽입되고 사용자는 게시판 글을 확인하면

alert 창으로 사용자의 쿠키값이 보여진다.

이렇게 사용자가 악의적인 목적을 가지고 악성 스크립트를 삽입하는 공격을

XSS 공격이라고 한다.

 

이제 Spring Boot 의 XSS Filter 를 적용해보겠다.

자세한 내용은 naver 형들이 github에 설명해주셨다.

아래 링크 참고해주세요!

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

 

1. XSS Filter 사용을 위한 lucy-xss-servlet-filter Dependency 추가

아래 내용을 pom.xml 에 dependency 추가한다.

<!-- XSS FILTER DEPENDENCY -->
<dependency>
    <groupId>com.navercorp.lucy
    </groupId>
    <artifactId>lucy-xss-servlet</artifactId>
    <version>2.0.1</version>
</dependency>

 

내용 추가 후 Project 마우스 오른쪽 클릭 > Maven > Update Project... 클릭

 

2. lucy-xss-servlet-filter-rule.xml 파일 설정

XSS Filter 설정을 하기 위한 rule 파일을 생성한다.

src/main/resources 경로 아래에 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>
</defenders>

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

 

lucy-xss-servlet-filter 는 크게 xssPreventerDefender, xssSaxFilterDefender, xssFilterDefender 로 구분한다.

  • xssPreventerDefender : <> 태그 안 전체를 필터링 해주는 기능
  • xssSaxFilterDefender, xssFilterDefender : White 리스트를 통해 예외 처리가 가능한 필터링 기능

본인은 필터링에 예외 처리가 필요하지 않으므로 xssPreventerDefender 만 추가했다.

 

* 자세한 내용은 아래 링크의 맨 아래 FAQ를 참고해주세요

https://github.com/naver/lucy-xss-servlet-filter/blob/master/doc/manual.md

 

3. XSS Filter Bean 설정

@Configuration 태그가 존재하는 곳에 아래 내용을 추가한다.

본인은 인터셉터 설정을 한 WebMvcConfigurer에 추가했다.

@Bean
public FilterRegistrationBean<XssEscapeServletFilter> getFilterRegistrationBean(){
    FilterRegistrationBean<XssEscapeServletFilter> xssRegistrationBean = new FilterRegistrationBean<>();
    xssRegistrationBean.setFilter(new XssEscapeServletFilter());
    xssRegistrationBean.setOrder(Ordered.LOWEST_PRECEDENCE);
    xssRegistrationBean.addUrlPatterns("/*");
    return xssRegistrationBean;
}

 

@Bean
public FilterRegistrationBean<XssEscapeServletFilter> getFilterRegistrationBean(){}

FilterRegistrationBean 클래스를 통해서 Filter 로 등록한다.

<T extends Filter> 는 Filter 클래스를 확장한 Type 아무거나 들어가면 된다.

Filter 클래스를 확장한 XssExcapeServletFilter 클래스를 사용한다.

 

xssRegistrationBean.addUrlPatterns("/*");

모든 URL에 XSS Filter 설정을 하면 모든 <> 태그들을 치환한다.

 

 

아래는 XSS Filter 설정 전과 설정 후의 결과값이다.

 

XSS Filter 설정 전

아래와 같이 html 코드와 <script>alert(document.cookie);</script> 를 포함하여 데이터를 전송했다.

 

아래와 같이 원본 그대로의 데이터가 찍힌걸 확인할 수 있다.

 

XSS Filter 설정 후

XSS Filter 설정에서 모든 <> 에 대해 설정했기 때문에 아래와 같이 모든 태그가 치환됐다.

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.