Java 审计 之过滤器防御xss

摘要:
Java审计之过滤器防御xss0x00前言本文从攻击与防守两个角度来思考一些审计中的小细节。在前面两篇的xss审计中,写少了一个比较重要的点,就是Filter过滤器。都说Java的审计第一步就是先看web.xml,能看到该cms使用的是哪些框架来进行开发。审计文章:Java审计之XSS篇Java审计之xss审计要点0x01Filter防御xss关于过滤器的内容,在Java学习系列文章中,其实已经讲到了。Java学习之Filter与Listener篇这里需要清楚一个概念,过滤器在任何框架都可以使用,而拦截器是SpringMVC独有的。
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文件的缘由。

下面来看图

Java 审计 之过滤器防御xss第1张

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

Java 审计 之过滤器防御xss第2张

Java 审计 之过滤器防御xss第3张

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

那么如果要防止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;
    }

}

Java 审计 之过滤器防御xss第4张

Java 审计 之过滤器防御xss第5张

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

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

Java 审计 之过滤器防御xss第6张

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 结尾

在末尾,还是贴张图吧!

Java 审计 之过滤器防御xss第7张

免责声明:文章转载自《Java 审计 之过滤器防御xss》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python CRM项目八利用Navicat Premium连接Oracle数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java操作PDF,在PDF文件指定位置输出水印

需要参考我的上一篇博客,定位PDF中的关键字,找出需要打印水印的坐标位置。 先说测试结果(PDF原件也是上一篇中的图片所示): 新生成的带有水印的PDF文件如下所示: junit测试代码及输出: maven配置文件 <!--引入pdf --> <dependency> <groupId>com.i...

Eclipse启动Tomcat时server.xml和content.xml自动还原问题

当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件。 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果。 为什么会还原? Tomcat服务器在Eclipse中启动时,会自动发布Eclipse中部署的项目,但是我的项目是自己手动在外面部署的,Eclipse只认得在它里...

过滤器 ||(filter)

http://www.cnblogs.com/lvdabao/p/3475426.html 原文地址 filter的两种使用方法 1. 在模板中使用filter 我们可以直接在{{}}中使用filter,跟在表达式后面用 | 分割,语法如下: {{ expression | filter }} 也可以多个filter连用,上一个filter的输出将作为下...

qt嵌入式html和本地c++通信方式

前沿:我们在做qt项目的时候,通常会把某个html网页直接显示到应用程序中。比如绘图。直接把html形式的图标嵌入到应用程序中 但是我们需要把数据从后台c++端传到html端,实现显示。qt实现了相关的方法 程序运行截图 一。先看客户端js代码     <script type="text/javascript" src="http://t.zou...

常见的php攻击(6种攻击详解)

1、SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。还有一种是通过system()或exec()命令注入的,它具有相同的SQL注入机制,但只针对shell命令。 [python] view plain copy $username=$_POST['username']; $query="sele...

HTML页面过渡效果大全

IE要求:  在IE5.5及以上版本的浏览器中.启用网页过渡效果  默认情况下都已经启用了,如果需要手动启用则只需在Internet选项中: Advanced(高级) - Browsing(浏览) - Enable page transitions(启用页面过渡)即可。应用过渡效果  当我们需要添加过渡效果时,只需在<head>中添加一个特殊的...