java代码审计之XSS

介绍:

对于和后端有交互的地方没有做参数的接收和输入输出过滤,导致恶意攻击者可以插入一些恶意的 js 语句
来获取应用的敏感信息。

审计思路:

扫描所有的 HttpServletRequest 查看相关的上下文环境。

这里以javasec为例:

先将1存储进去

 

这里是将xss存储到了cookie里边

java代码审计之XSS_第1张图片

访问就可以看见了

java代码审计之XSS_第2张图片

javasec处理方法:

java代码审计之XSS_第3张图片

这里提供几个具体的处理方式。

修复方案:

方案一

全局编写过滤器

1、首先配置 web.xml,web.xml是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的,web.xml文件的主要作用用来配置:欢迎页、servlet、filter等。但是当web工程中没用到这些时,可以不用web.xml文件来配置web工程。做全局过滤器需要要用到 filter,因此首先要做的是来配置web.xml文件,添加如下配置信息:


xssAndSqlFilter
com.cup.cms.web.framework.filter.XssAndSqlFilter


xssAndSqlFilter
*

这里要注意的是,我们的配置是/*而不是/< url-pattern>/ 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url,而< url-pattern>/*会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js*.html)

2、编写过滤器

然后编写过滤器的内容就行了,这个网上有写好的,可以直接拿来用,如下:

//XssFilter实现
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
	}
@Override
public void destroy() {
	}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException {
	chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request),response);
   	}
}

3、再实现servletRequest的包装类

//XssHttpServletRequestWrapper实现
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    @SuppressWarnings("rawtypes")
    public Map getParameterMap(){
        Map request_map = super.getParameterMap();
        Iterator iterator = request_map.entrySet().iterator();
        while(iterator.hasNext()){
            Map.Entry me = (Map.Entry)iterator.next();
            String[] values = (String[])me.getValue();
            for(int i = 0 ; i < values.length ; i++){
                values[i] = xssClean(values[i]);
            }
        }
        return request_map;
    }
     public String[] getParameterValues(String paramString)
      {
        String[] arrayOfString1 = super.getParameterValues(paramString);
        if (arrayOfString1 == null)
          return null;
        int i = arrayOfString1.length;
        String[] arrayOfString2 = new String[i];
        for (int j = 0; j < i; j++){
            arrayOfString2[j] = xssClean(arrayOfString1[j]);
        }
        return arrayOfString2;
      }
      public String getParameter(String paramString)
      {
        String str = super.getParameter(paramString);
        if (str == null)
          return null;
        return xssClean(str);
      }
      public String getHeader(String paramString)
      {
        String str = super.getHeader(paramString);
        if (str == null)
          return null;
        str = str.replaceAll("\r|\n", "");
        return xssClean(str);
      }
      private String xssClean(String value) {
        //ClassLoaderUtils.getResourceAsStream("classpath:antisamy-slashdot.xml", XssHttpServletRequestWrapper.class)
        if (value != null) {
            // NOTE: It's highly recommended to use the ESAPI library and
            // uncomment the following line to
            // avoid encoded attacks.
            // value = encoder.canonicalize(value);
            value = value.replaceAll("\0", "");
            // Avoid anything between script tags
            Pattern scriptPattern = Pattern.compile("",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid anything in a src='...' type of expression
            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid anything in a href='...' type of expression
            scriptPattern = Pattern.compile("href[\r\n]*=[\r\n]*\\\"(.*?)\\\"",
                                Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                                        | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome  tag
            scriptPattern = Pattern.compile("",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome 
                    
                    

你可能感兴趣的:(java代码审计)