티스토리 뷰
xss 공격이란 크로스 사이트 스크립트로 서버로 보내는 입력값에 자바스크립트를 보내서
다른 사용자에게 자신이 만든 스크립트를 실행시켜 사용자의 정보를 빼내는 것이다.
xss 공격에 노출되어 있는지 확인하는 방법은 간단하다.
프로젝트를 돌린 후, 아무 입력창에 <script>alert('test')</sctipt> 를 넣은 후 테스트해보면 된다.
스크립트가 실행되면 xss filter가 걸려있지 않는 프로젝트다.
xss 방어에는 여러가지 방법이 있지만 네이버에서 제공하는 lucy xss filter를 적용 시켜봤다.
1. 일단 pom.xml에 dependency를 추가한다.
<dependency> <groupId>com.navercorp.lucy</groupId> <artifactId>lucy-xss-servlet</artifactId> <version>2.0.0</version> </dependency>
2. src/main/resources 폴더안에 두가지 xml을 추가한다.
add. 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-superset-sax.xml</param-value> <!-- lucy-xss-filter의 sax용 설정파일 --> <param-value>true</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>true</param-value> <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 --> </init-param> </defender> </defenders> <!-- default defender 선언, 필터링 시 지정한 defender가 없으면 여기 정의된 default defender를 사용해 필터링 한다. --> <default> <defender>xssPreventerDefender</defender> </default> <!-- global 필터링 룰 선언 --> <global> <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 또한 globalPrefixParameter1로 시작하는 파라메터도 필터링 되지 않는다. globalPrefixParameter2는 필터링 되며 globalPrefixParameter3은 필터링 되지 않지만 더 정확한 표현이 가능하므로 globalPrefixParameter2, globalPrefixParameter3과 같은 불분명한 표현은 사용하지 않는 것이 좋다. --> <params> <param name="globalParameter" useDefender="true" /> </params> </global> <!-- url 별 필터링 룰 선언 --> <url-rule-set> <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. --> <!-- <url-rule> <url disable="true">/login/login/loginAjax</url> </url-rule> --> </url-rule-set> </config>
add. lucy-xss-superset-sax.xml
<?xml version="1.0" encoding="UTF-8"?> <config xmlns="http://www.nhncorp.com/lucy-xss" extends="lucy-xss-default-sax.xml"> <elementRule> <element name="body" disable="true" /> <!-- <BODY ONLOAD=alert("XSS")>, <BODY BACKGROUND="javascript:alert('XSS')"> --> <element name="embed" disable="true" /> <element name="iframe" disable="true" /> <!-- <IFRAME SRC=”http://hacker-site.com/xss.html”> --> <element name="meta" disable="true" /> <element name="object" disable="true" /> <element name="script" disable="true" /> <!-- <SCRIPT> alert(“XSS”); </SCRIPT> --> <element name="style" disable="true" /> <element name="link" disable="true" /> <element name="base" disable="true" /> </elementRule> <attributeRule> <attribute name="data" base64Decoding="true"> <notAllowedPattern><![CDATA[(?i:s\\*c\\*r\\*i\\*p\\*t\\*:)]]></notAllowedPattern> <notAllowedPattern><![CDATA[(?i:d\\*a\\*t\\*a\\*:)]]></notAllowedPattern> <notAllowedPattern><![CDATA[&[#\\%x]+[\da-fA-F][\da-fA-F]+]]></notAllowedPattern> </attribute> <attribute name="src" base64Decoding="true"> <notAllowedPattern><![CDATA[(?i:s\\*c\\*r\\*i\\*p\\*t\\*:)]]></notAllowedPattern> <notAllowedPattern><![CDATA[(?i:d\\*a\\*t\\*a\\*:)]]></notAllowedPattern> <notAllowedPattern><![CDATA[&[#\\%x]+[\da-fA-F][\da-fA-F]+]]></notAllowedPattern> </attribute> <attribute name="style"> <notAllowedPattern><![CDATA[(?i:j\\*a\\*v\\*a\\*s\\*c\\*r\\*i\\*p\\*t\\*:)]]></notAllowedPattern> <notAllowedPattern><![CDATA[(?i:e\\*x\\*p\\*r\\*e\\*s\\*s\\*i\\*o\\*n)]]></notAllowedPattern> <notAllowedPattern><![CDATA[&[#\\%x]+[\da-fA-F][\da-fA-F]+]]></notAllowedPattern> </attribute> <attribute name="href"> <notAllowedPattern><![CDATA[(?i:j\\*a\\*v\\*a\\*s\\*c\\*r\\*i\\*p\\*t\\*:)]]></notAllowedPattern> </attribute> </attributeRule> </config>
3. 메소드 추가
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { FilterRegistration.Dynamic xssFilter = servletContext.addFilter("xssFilter", new XssEscapeServletFilter()); xssFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); super.onStartup(servletContext); } }
입력해주는 곳에서 <script>alert('test')</sctipt>를 쳐보면 xss filter를 해주긴 전에는 스크립트가 그대로 실행되어 test가 보였지만 적용시키고 나니 문자열이 그대로 보이고 스크립트는 실행되지 않는다.
'Development > JAVA' 카테고리의 다른 글
[JAVA] Bearer token Authorization (0) | 2021.08.22 |
---|---|
[JAVA] URL 한글 인코딩 (0) | 2021.08.20 |
[JAVA] 페이징 pageable example (without jpa) (0) | 2021.08.20 |
[JAVA] ElasticSearch 키워드 검색 (0) | 2021.08.11 |
Spring Boot security OAuth2 연동 (1) | 2021.07.27 |
댓글
링크
최근에 올라온 글
- Total
- Today
- Yesterday