반응형
XSS 방어 방법 ( 크로스사이트스크립팅 )
웹 화면 내 input box 가 있는 곳에 script를 악의적으로 사용하여 정보를 추출할 수 있습니다.
악성 스크립트
"><script>alert(document.cookie)</script>)
위와 같이 입력했을 때 외부인이 쿠키정보를 손쉽게 얻을 수 있습니다.
<> 태그나 () 등의 특수문자를 문자 그대로 인식하지 않도록 처리하여
악의적인 사용을 막을 수 있게 합니다.
처리방법
톰캣 web.xml
XSS util.filter.XSSFilter XSS /*
filter-class : 특수문자를 필터하는 로직이 담긴 내용을 입력
url-pattern : 특정 경로로 유입되는 경우에 필터를 적용 ( /* 을 입력 시 모든 경로에 해당 )
Filter 를 implements 해서 상세구현을 합니다.
XSSFilter.java
package util.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class XSSFilter implements Filter {
@SuppressWarnings("unused")
private Object filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void destroy() {
this.filterConfig = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
}
}
각 유형에 해당하는 문자를 필터하는 내용입니다.
RequestWrapper.java
package util.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class RequestWrapper extends HttpServletRequestWrapper {
public RequestWrapper(HttpServletRequest servletRequest){
super(servletRequest);
}
public String[] getParameterValues(String parameter){
String[] values = super.getParameterValues(parameter);
if(values == null){
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for ( int i = 0; i<count; i++){
encodedValues[i] = cleanXSS(values[i]);
}
return encodedValues;
}
public String getParameter(String parameter){
String value = super.getParameter(parameter);
if(value == null){
return null;
}
return cleanXSS(value);
}
public String getHeader(String name){
String value = super.getHeader(name);
if(value==null){
return null;
}
return cleanXSS(value);
}
/**
* 크로스사이트 스크립팅 필터처리
* @param value
* @return
*/
private String cleanXSS(String value){
value = value.replaceAll("<" , "<");
value = value.replaceAll(">" , ">");
value = value.replaceAll("\\(" , "(");
value = value.replaceAll("\\)" , ")");
value = value.replaceAll("'" , "'");
value = value.replaceAll("eval\\((.*)\\)" , "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']" , "\"\"");
value = value.replaceAll("[\\\"\\\'][\\s]*vbscript:(.*)[\\\"\\\']" , "\"\"");
value = value.replaceAll("script" , "");
value = value.replaceAll("onload" , "no_onload");
value = value.replaceAll("expression" , "no_expression");
value = value.replaceAll("onmouseover" , "no_onmouseover");
value = value.replaceAll("onmouseout" , "no_onmouseout");
value = value.replaceAll("onclick" , "no_onclick");
value = value.replaceAll("<iframe" , "<iframe");
value = value.replaceAll("<object" , "<object");
value = value.replaceAll("<embed" , "<embed");
value = value.replaceAll("document.cookie" , "document.cookie");
return value;
}
}
처음에 서술했던 악성 스크립트를 입력했을 때 cookie 정보가 나오지 않는 것을 확인합니다.
반응형
'IT > 보안' 카테고리의 다른 글
| 윈도우10 네트워크 공유폴더 안보임 해결 (1) | 2020.03.06 |
|---|---|
| 빵집 다운로드 최신버전 무료로 다운받아 사용하세요 ( 사용법 추가 ) (0) | 2019.12.31 |
| 시스템 운영정보 노출 및 아파치버전 숨기는 설정 (0) | 2019.06.15 |
| 디렉토리 목록 노출 취약점 및 해결방법 (1) | 2019.06.14 |
| 불필요한 메서드 제한 - 웹 취약점 제거방법 (2) | 2019.02.09 |