java过滤器过滤xss_Java 审计 之过滤器防御xss

本文探讨了如何使用Java过滤器防御XSS攻击。通过在web.xml配置XssFilter,并利用XssFilterWrapper对请求参数进行HtmlUtils实体编码,实现全局过滤。然而,这种做法可能导致某些特殊场景下需要原始值,从而引入新的风险。审计时要注意即使有全局过滤器,仍可能存在XSS漏洞。
摘要由CSDN通过智能技术生成

Java 审计 之过滤器防御xss

0x00 前言

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

审计文章:

0x01 Filter防御xss

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

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

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

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

下面来看图

8c2d2e096c9fa6764d0ad26e568cf216.png

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

b705e809fcd3d09c9ff089e6c6c346d7.png

44388ec6751899cae570d9ab24cd51f8.png

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

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

在web.xml中配置

web.xml文件 :

xssFilter

com.test.filter.xssFiler

xssFilter

/*

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;

}

}

c283209923120fff8fd8e189ae05fb89.png

d2c96fbac09e08914d8963c665b74cd4.png

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

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

eb8ee45b7c7d7fc1419cb88a4af7ae50.png

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

在末尾,还是贴张图吧!

e463db69e67c51b59b00bff80143895e.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值