반응형
java 전자정부프레임워크의 10년도 더된 버전을 쓰다보니
웹취약점도 빡쌔게 느껴진다.
검사도 multipart가 아닌 전송방법인데도 multipart로 일부로 바꿔서 테스트도 하고 빡쌔다.
그래도 뭐 해결해야지.
<!--web.xml -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param> </filter>
<filter>
<filter-name>multipartFilter</filter- name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param> <param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.filter.XSSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!--context-common.xml -->
<bean id-"filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="214748364800" />
</bean>
기존에는 뭐때문인지 multipart 자체가 충돌난다며 빼버리고
StringUtil.java 에서 파라미터 하나하나 일일이 적용해 주고 검사할때 마다 추가해서 사용중이였다.
XSSFilter.java
public class XSSFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if(request instanceof MultipartHttpServletRequest) (//multipart request
HttpServletRequest httpRequest= (HttpServletRequest)request;
String path = httpRequest.getRequestURI();
if(!path.contains("/admin/")
&& (httpRequest.getContentType() != null && httpRequest.getContentType().startsWith("multipart/form-data"))) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)httpRequest;
Map<String, String[]> parameterMap multipartRequest.getParameterMap();
for(Map.Entry<String, String[]> entry :parameterMap.entryset()) {
String paramName = entry.getKey();
String[] paramValues = entry.getValue();
boolean excluded = XSSRequestWrapper.excludedParameterResult(paramName);
if(excluded == false) {
for(int i-0;i<paramValues.length;i++) {
//paramValues[i] = XSSRequestWrapper.cleanXSS(new String(paramValues[i].getBytes("8859_1"),"utf-8"));
paramValues[i] - XSSRequestWrapper.cleanMultiXSS(paramValues[i]);
}
}
}
}
chain.doFilter(request, response);
}else {//request
//기존에는 아래 한줄만 사용 중이였음.
chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}
}
}
multipart/form-data 안에는 감싸져있는게 많기에 해당 파라미터에 접근을 해서
파일을 제외한 파라미터를 치환을 해줘야하는 과정이 추가 되어야한다.
그리고
static String cleanMultiXss(String value){
value = value.replaceAll("<","<").replaceAll(">",">");
value = value.replaceAll("'","&apos");
value = value.replaceAll("\"", """);
value = value.replaceAll("(?!)cookie)","");
return value;
}
&는 치환할거라면 중복으로 사용해서는 안된다.
중복 치환되버리면 골치아파짐.
< -> &lt;
이런식으로 치환되버려서 화면 자체가 깨질수 있음.
뭐 제대로 되어있는 곳이라면 이렇게 따로빼서 적용할 일은 없겠지만....
반응형
'Start' 카테고리의 다른 글
오라클 데이터베이스 테이블스페이스 용량 체크 (0) | 2024.11.07 |
---|---|
오라클 commit 잘못 했을때 당황하지 말고 timestamp (0) | 2024.10.04 |
java 이미지 리사이징 해상도변경 픽셀변경 (1) | 2024.09.26 |
리눅스에 java 설치 및 환경변수 설정 (1) | 2024.09.26 |
안드로이드 하이브리드앱 java, js 이용시 (0) | 2023.10.18 |