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 설정에서 모든 <> 에 대해 설정했기 때문에 아래와 같이 모든 태그가 치환됐다.