728x90
XSS란?
- Cross-site Scripting
- 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법
- 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며,
보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취 - 자바스크립트를 사용하여 공격하는 경우가 많음
- Text-Only 게시판 등에서는 XSS가 발생하는 경우는 없다
- Stored XSS
- 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식
- Reflected XSS
- URL 파라미터(특히 GET방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식
- 브라우저 자체에서 차단하는 경우가 많아 상대적으로 공격을 성공시키기 어려움
- 방어 방법
- XSS는 데이터를 입출력 할 때 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋다
- 자바는 XSS필터를 만든 뒤 web.xml에 선언하여 모든 파라미터가 해당 필터를 거치도록 하는 것만으로도 효과를 볼 수 있다
- 필터 제작 시 < 는 < , > 는 > 처럼 HTML 문자로 바꾸어 사용
- 사용할만한 라이브러리 : OWASP Antisamy, NAVER Lucy XSS Filter, ESAPI 등
Lucy Xss Filter
- XSS공격을 방어하는 JAVA 라이브러리
- 화이트 리스트(White List) 설정 방식
- 화이트 리스트란 ? > 기본 정책이 모두 차단인 상황에서 예외적으로 접근이 가능한 대상을 지정하는 방식
- 규칙을 선언한 XML 파일의 상속, 오버라이딩 가능
- 보안 정책을 정하는 부서에서 상위 설정 파일을 제공하고 서비스별로 필요한 정책을 하위 선언 파일에 기술하는 방식으로 사용 가능
- 메모리를 효율적으로 쓰는 SAX방식의 HTML 파싱 모듈 제공
- SAX(Simple API for XML)
- XML 문서를 순차적으로 읽어들이면서 노드가 열리고 닫히는 과정에서 이벤트 발생
- 문서 일부의 임의 접근은 불가하지만 적은 메모리나 빠른 처리를 요하는 경우 적합함.
- 발생한 이벤트를 핸들링하여 변수에 저장, 활용 하는 것이므로 복잡하고 노드 수정이 어려움
- SAX(Simple API for XML)
Lucy XSS Filter는 Maven Central Repository에 배포되어 있다.
1. pom.xml 의존성 설정
<dependency>
<groupId>com.navercrop.lucy</groupId>
<artifactId>lucy-xss</artifactId>
<version>X.X.X</version>
</dependency>
2. XssFilter - SAX방식
- HTML 요소를 허용하되 XSS 공격에 위험한 요소를 걸러내야 할 때 사용
- HTML이 허용되는 게시판의 본문 등에 적용할 수 있음
- DOM 트리 생성 과정 및 부모 자식 간의 검사가 생략되어 DOM 방식에 비해 속도가 약 20% 빠름
- 특히 중첩된 태그가 많은 인풋일수록 SAX방식에서 큰 속도 향상이 있음
- lucy-xss-superseet-sax.xml 작성
- lucy-xss-sax.xml 작성
- 모든 설정 파일 작성 후 클래스패스의 최상위 경로에 저장
- 특정 설정 파일을 명시할때는 .getInstance(String)을 사용한다
- 문자열 필터링은 doFilter(String) 메서드를 활용한다
- 공격패턴 검출시 디버그를 위해 추가되는 주석문을 표시하지 않기 위해서는 true 추가
LucyXssFilter filter = XssSaxFilter.getInstance("lucy-xss-sax.xml");
XssSaxFilter filterNoComment = XssSaxFilter.getInstance(true);
XssSaxFilter otherFilterNoComment = XssSaxFilter.getInstance("lucy-xss-sax.xml", true);
String clean = filter.doFilter(String dirty);
String otherClean = filter.doFilter(char[]dirty, int offset, int count, Writer writer)
/* XSS코드가 포함된 문자열을 char[]로 받아
신뢰할 수 있는 코드로 변환하거나 삭제한 후
결과물을 인자로 받은 writer객체에 write한다
즉, 외부에서 writer를 제어할 수 있는 인터페이스 제공 */
String doFilter(String tagName, String attName, String dirtyAttValue)
/* 특정 HTML 요소 내의 속성값으로 삽입되는 XSS 코드를 신뢰할 수 있는 코드로 변환하거나 삭제 */
3. XssSaxFilter
<config xmlns="http://www.nhncrop.com/lucy-xss" extends="lucy-xss-superset-sax.xml">
<!--xmlns : 디폴트 네임스페이스
extends : 상속 받을 설정 파일 이름
-->
<elementRule></elementRule> <!--적용 가능한 모든 요소에 대한 필터링 규칙 설정-->
<attributeRule></attributeRule> <!-- 적용 가능한 모든 속성에 대한 필터링 규칙 설정 -->
</config>
elementRule
<elementRule> <!-- 하나 이상의 element 요소로 정의되며, element 필터링 규칙에 없는 요소는 필터링 대상이 된다 -->
<element name="a" override="true" disable="false">
<!-- element : 하나의 요소에 대한 필터링 규칙을 설정
name : 요소 이름
override : 'extends'속성에 기술한 상위 설정 파일에 동일한 설정이 있으면 그 설정을 상속받을지 설정. 디폴트 true
disable : name에 설정된 요소를 elementRule에서 제거할지 설정. 디폴트는 false -->
<listener>com.nhncorp.security.xss.XXXListener</listener>
<!-- lestener : 이 화이트리스트 설정 파일의 설정만으로 해당 요소를 필터링할 수 없는 경우,
com.nhncrop.lucy.security.xss.event.ElementListener 인터페이스를 상속하여 구현한 클래스 이름 입력 -->
</element>
</elementRule>
attributeRule
<attributeRule> <!-- attributeRuel : 하나 이상의 하위 attribute 태그를 가지는 부모 태그 -->
<attribute name="class" override="true" disable="false" base64Decoding="true">
<!--attribute : 하나의 속성에 대한 필터링 규칙 설정
name : 속성 이름
override : config의 'extends' 속성에 설정한 상위 설정 파일에 동일한 설정이 있으면 그 설정을 상속받을지를 결정. 디폴트 true
disable : name에 설정된 속성을 attributeRule 에서 제거할지 설정. 디폴트는 flase
base64Decoding : 속성 값에 필터링 규칙을 적용하기 전에 base64 디코딩 수행 여부를 설정. 디폴트는 false -->
<allowedPattern><![CDATA[ ]]></allowedPattern>
<!--allowedPattern : 속성값으로 허용되는 정규 표현식 (regular expression)을 입력.
패턴에 해당되지 않는 모든 속성 값은 필터링된다. -->
<!--혹은-->
<notAllowedPattern><![CDATA[ ]]></notAllowedPattern>
<!--notAllowedPattern : 속성 값으로 허용되지 않는 정규 표현식을 입력.
패턴에 해당되는 모든 속성 값은 필터링됨. -->
</attribute>
</attributeRule>
참고 : https://naver.github.io/lucy-xss-filter/kr/
Lucy XSS Filter
XSS 공격이 가능한 HTML 요소를 신뢰할 수 있는 코드로 변환하거나 삭제하는 기능을 제공한다. 공격이 가능하지 않은 HTML 요소는 허용을 한다. 4.1. 설정 파일 Lucy-XSS Filter의 필터링 규칙은 화이트리
naver.github.io
728x90
'△ > SecureCoding' 카테고리의 다른 글
JS) SQL 삽입 (0) | 2023.02.24 |
---|---|
보안결정을 신뢰할 수 없는 입력 값에 의존 (2) | 2023.02.01 |
SQL 삽입 공격 : Hibernate (0) | 2023.02.01 |
안전하지 않은 리플렉션 (2) | 2023.02.01 |
JS) eval() 을 사용하면 안되는 이유 (0) | 2023.02.01 |
댓글