Java 审计 之过滤器防御xss

Java审计之过滤器防御xss0x00前言本文从攻击与防守两个角度来思考一些审计中的小细节。在前面两篇的xss审计中,写少了一个比较重要的点,就是Filter过滤器。都说Java的审计第一步

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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

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

Java 审计 之过滤器防御xss

Java 审计 之过滤器防御xss

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

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

Java 审计 之过滤器防御xss

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

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

Java 审计 之过滤器防御xss

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119919.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm配置python运行环境_pycharm安装django

    pycharm配置python运行环境_pycharm安装django新手下载安装pycharm并且配置pycharm下载安装pycharm电脑是32位就选择32位电脑是64位就选择64位选择next就搞定了配置环境变量第一步、找到pycharm的程序文件的地址右键->属性->复制“起始位置”里面的位置第二步、添加到电脑的环境变量我的电脑->右键->属性->高级系统设置->高级->环境变量->Administrator->找到Path->编辑->新建->粘贴pycharm程序文件地址-&

    2022年8月28日
    0
  • 关于数据库读写分离

    1、what读写分离读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。2、why那么为什么要读写分离呢?因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。但是数据库的“读”(从oracle读…

    2022年4月6日
    43
  • 什么是publickeytoken及publickeytoken的作用

    什么是publickeytoken及publickeytoken的作用什么是publickeytoken及publickeytoken的作用dll的publickeytoken的作用。

    2022年7月1日
    22
  • node.js介绍及其常用命令

    node.js介绍及其常用命令NodeJs简介:-node.js是提供了一个JavaScript的后台运行环境,简单地说就是运行在服务器端的JS浏览器是Javascript的前端网页的运行环境地址:https://nodejs.org/zh-cn/nodejs和javascript的区别1、nodejs中不支持DOM、BOM的操作支持JS的逻辑运算、函数、数据、json、对象、数组等操作2、专业的说法:Node.js是一个事件驱动I/O服务器的Javascipt运行环境,基于Google的V8引擎,V8引擎执行JS的

    2022年7月16日
    11
  • Java 程序员必须掌握的 4 大开源框架!

    Java 程序员必须掌握的 4 大开源框架!对于开发来说,我们在工作中普遍都会用到各个开源框架,比如最基础的Spring,使开发网络编程变得特别简单的Netty框架,还有成为目前微服务框架首选的SpringCloud等。在多个框架之上,我们仅需使用几行代码,即可实现业务需要的复杂功能,大大减少了工作量。也正因如此,不少人只会用框架,看不懂源码,不了解其底层机制与实现原理,成了一名只会搬运源码库的开发。说白了,就是真正牛逼的技术不属于你。可了解框架中的很多知识和代码,对解决开发中的类似问题是极其有帮助的。因为它们是经过时..

    2022年7月8日
    34
  • java线程池springboot_springboot线程池的使用和扩展(转)「建议收藏」

    java线程池springboot_springboot线程池的使用和扩展(转)「建议收藏」实战环境windowns10;jdk1.8;springboot1.5.9.RELEASE;开发工具:IntelliJIDEA;实战源码本次实战的源码可以在我的GitHub下载,地址:git@github.com:zq2599/blog_demos.git,项目主页:https://github.com/zq2599/blog_demos这里面有多个工程,本次用到的工程为threadpoold…

    2022年6月17日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号