-
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
- 장점
- XML 설정 만으로 XSS 방어가 가능해짐
- 비지니스 레이어의 코드 수정이 발생하지 않음
- 개발자가 XSS 방어를 신경 쓰지 않아도 됨
- XSS 방어가 누락되지 않음
- 설정 파일 하나로 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); // => ""><script>alert('xss');</script>" 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>
여기까지 조치했을때에는 모의해킹 취약점 점검은 모두 통과 !
반응형'ETC. > 인증 심사' 카테고리의 다른 글
RSA 암호화 적용하기 (1) 2021.06.21 웹 접근성 준수 요구 사항 (0) 2020.04.28 사이트 개인정보 보호조치 요구 사항 (0) 2020.04.28 [보안취약점] 게시판 5분 이내 작성 게시글 수 체크 (0) 2020.04.28 - 장점