zoukankan      html  css  js  c++  java
  • Java 审计 之过滤器防御xss

    Java 审计 之过滤器防御xss

    0x00 前言

    本文从攻击与防守两个角度来思考一些审计中的小细节。在前面两篇的xss审计中,写少了一个比较重要的点,就是Filter过滤器。都说Java的审计第一步就是先看web.xml,能看到该cms使用的是哪些框架来进行开发。其次就是看其有没有配置的一些过滤器。

    审计文章:

    Java审计之XSS篇

    Java 审计之xss审计要点

    0x01 Filter防御xss

    关于过滤器的内容,在Java学习系列文章中,其实已经讲到了。

    Java学习之Filter与Listener篇

    这里需要清楚一个概念,过滤器在任何框架都可以使用,而拦截器是Spring MVC独有的。

    而过滤器需要配置在web.xml 里面,而拦截器会配置在springmvc.xml文件里面。

    这里就引出了我们为什么要看web.xml文件的缘由。

    下面来看图

    这是自己用ssm写的一个增删改查页面。点击一下添加直接在eamil位置添加一个xss Payload。

    发现已经弹框了。在代码当中没做任何的处理。

    那么如果要防止xss,前面的审计文章也讲到过使用一个类,讲接收的参数从输出或输出的时候对他进行一个处理,但是如果开发人员一个不注意,某个点上忘记对该点进行处理,那么漏洞还是会存在的。而且每次输出输入都要进行处理,操作繁琐。要解决这个问题我们可以使用到这里讲到的过滤器,进行一个全局过滤。

    在web.xml中配置

    web.xml文件 :

    <filter>
        <filter-name>xssFilter</filter-name>
        <filter-class>com.test.filter.xssFiler</filter-class>
      </filter>
      <!-- 解决xss漏洞 -->
      <filter-mapping>
        <filter-name>xssFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    filter代码:

    package com.test.filter;
    
    
    import com.test.utils.XssFilterWrapper;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    /**
     * 作用:Xss过滤器
     * 作者:Tiddler
     * 时间:2018/11/11 10:21
     * 类名: XssFilter
     **/
    public class xssFiler implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //使用包装器
            System.out.println("过滤器执行了");
            XssFilterWrapper xssFilterWrapper=new XssFilterWrapper((HttpServletRequest) servletRequest);
            filterChain.doFilter(xssFilterWrapper,servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    

    XssFilterWrapper代码:

    package com.test.utils;
    
    
    import org.springframework.web.util.HtmlUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    
    /**
     * 作用:防Xss过滤器[包装器]
     * 作者:Tiddler
     * 时间:2018/11/11 10:20
     * 类名: XssFilterWrapper
     **/
    public class XssFilterWrapper extends HttpServletRequestWrapper {
        public XssFilterWrapper(HttpServletRequest request) {
            super(request);
        }
        /**
         * 对数组参数进行特殊字符过滤
         */
        @Override
        public String[] getParameterValues(String name) {
            if("content".equals(name)){//不想过滤的参数,此处content参数是 富文本内容
                return super.getParameterValues(name);
            }
            String[] values = super.getParameterValues(name);
            String[] newValues = new String[values.length];
            for (int i = 0; i < values.length; i++) {
                newValues[i] = HtmlUtils.htmlEscape(values[i]);//spring的HtmlUtils进行转义
            }
            return newValues;
        }
    
    }
    
    

    这里插入xss后没有执行,而是直接被输出出来了。

    在代码中,打印一下输入的所有值,发现在email的值里面,其实已经被实体编码了。

    0x02 一些小思考

    在了解完过滤器可以防止XSS后,那么如果审计代码发现调用的地方都没有过滤的话,有可能是使用了Filter过滤器进行了一个全局过滤。那么这样可能就会 引发一个问题,就是在java中xss出现的概率可能会偏少,如果都直接能全局过滤了,那么为什么还要使用复杂的方式一个一个去过滤呢?当然也会有特殊情况,比如想要取一个值,但是又不想被实体编码,那么这时候就不得不去另外调用方法去对这个值进行处理了。来看看写的XssFilterWrapper代码的一个案例。

     if("content".equals(name)){//不想过滤的参数,此处content参数是 富文本内容
                return super.getParameterValues(name);
            }
    

    这里如果取了content参数,而这个参数是未经处理的,那么还是会存在xss的可能。

    参考文章

    https://blog.csdn.net/qq_31384551/article/details/83956681
    https://www.cnblogs.com/hero123/p/9091625.html
    

    0x03 结尾

    在末尾,还是贴张图吧!

    WX:TG9yaTI1NDgyNjYxNDU= 欢迎各位师傅来一起做技术交流
  • 相关阅读:
    Gym
    Gym 100712H
    CodeForces
    CodeForces
    P1103 书本整理(DP)
    P1435 回文子串(最长公共子序列)
    P1095 守望者的逃离(线性DP)
    P1077 摆花(背包)
    P1832 A+B Problem(再升级)
    P1757 通天之分组背包(分组背包)
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13691349.html
Copyright © 2011-2022 走看看