본문 바로가기

Start

웹취약점 xss 크로스사이트 multipart

반응형

 

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("<","&lt;").replaceAll(">","&gt;");
    value = value.replaceAll("'","&apos");
    value = value.replaceAll("\"", "&quot;");
    value = value.replaceAll("(?!)cookie)","");
    
    return value;
}

 

&는 치환할거라면 중복으로 사용해서는 안된다.

중복 치환되버리면 골치아파짐.

&lt; -> &amp;lt;

이런식으로 치환되버려서 화면 자체가 깨질수 있음.

 

뭐 제대로 되어있는 곳이라면 이렇게 따로빼서 적용할 일은 없겠지만....

 

 

 

반응형