Struts2 045 漏洞修补方式(非官方,亲测可行)

前几天听说Struts2 出了新漏洞,吓得我赶紧测试了一下自己公司的项目,结果吓人一跳,真正通杀,于是想怎么修补这个漏洞。官方给的修补方式只有更新最新版,那么这个时候问题来了:如果我的是很老的版本咋办?更新了代码很多地方不一样啊?如果你存在这个问题,那么这篇文章应该是个很好的修补方式

1:漏洞分析

这次这个漏洞又是处在拦截器上面,几乎只要访问那么就能触发漏洞,struts的拦截器默认是:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

2:漏洞修补思路

昨晚在知乎看到一片文章:https://zhuanlan.zhihu.com/p/25639832?utm_medium=social    思路和我的差不多,但是我自己测试发现没有效果(可能是我自己代码的问题),于是我想到了;另外一种修补方式,既然是出在拦截器上面那么解决办法肯定要从拦截器出手,于是我想到了继承struts的默认拦截器,重写doFilter方法(java的强大就是面向对象,继承重写)

3:修补代码

package com.m7lrv.ssh.base.jakarta;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter;//2.5.0的

//import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;//2.3.1的类
/**
* Struts2 - 045 漏洞修补代码
* @author M7lrv QQ:308691926
*
*/
public class M7lrvJakartaFilter extends StrutsPrepareAndExecuteFilter{

//默认白名单(如果需求有需要可自行增加)
private final String[] contents = new String[]{"application/x-www-form-urlencoded","multipart/form-data","text/plain"};

public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
String contenType = request.getHeader("ConTent-Type");
if(contenType!=null && !"".equals(contenType)){
for (int i = 0; i < contents.length; i++) {
if(contenType.equalsIgnoreCase(contents[i])){//合法的
super.doFilter(arg0, arg1, arg2);
return;
}else if(i==contents.length-1){//非法的
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("非法请求Content-Type!");
return;
}
}
}
super.doFilter(arg0, arg1, arg2);//调用父类的
}

public void init(FilterConfig arg0) throws ServletException {
super.init(arg0);
}

}

4:测试效果图

上面的是没有修补的效果

修补后测试效果

web.xml配置

2017-03-14 更新:放弃白名单机制(测试发现很多白名单需要过滤),采用正则表达式拦截

//需要引入:import com.m7lrv.utils.string.M7lrvStringHelper;
if(new M7lrvStringHelper().equals(contenType.trim(), "\\w+/(\\w|-)+(;(\\s+|)\\w+=(\\w|-)+|)", true)){//合法的
				super.doFilter(arg0, arg1, arg2);
				return;	
			}else{//非法的
				response.setContentType("text/html;charset=UTF-8");
				response.getWriter().write("非法请求Content-Type!");
				return;
			}

 

以上就是修补方式+思路,如果有什么问题可以联系我(下面附上编译好的文件,这样你可以不修改你网站的任何代码达到修补的方式,如果默认拦截器不同那么需要自己写代码)

Struts2 045 漏洞修class文件

m7lrv-utils-1.0.0

小伙伴的福利来咯

原创发布m7lrv-tools-1.0.0.jar

这里是自己封装的一个jar,里面包含了相当多的方法(功能),举个简单的例子吧。“哎呀,好像让程序去压缩文件啊!!”那么重点来了使用我 的jar文件只需简单两句代码即可完成zip文件压缩

M7lrv_ZipHelper zip = new M7lrv_ZipHelper();
boolean result2=zip.getCompZip_File(“d:/1.txt”, “d:/jb.zip”);

就这么简单两句话就o了,屌吧?呵呵 大家可以先下载,说明文档我还在整理中,今天是项目经理不在偷懒才来更新一下文章的!

简单说明一下jar里面的功能:文件操作(写出文件,读取文件….),zip文件的压缩读取,电脑dos命令执行,日期操作,正则表达式操作,集合去重复,随机数操作,图片操作(水印添加)…….太多了不一一说了,预计说明文档会在5 1后吧 放假才有时间去整理。

 重点:本jar程序不需要依赖第三方的jar程序例如zip文件压缩很多需要ant.jar或者其他jar支持才能行,我的不需要!

后期还会发布.NET版本的tools哦小伙伴期待吧!!

程序源码截图(特别说明jar源码后期会发布)

1

1

2

3

 

程序下载:m7lrv tools

不会使用jar文件的可以自己百度看看(如果文件下载不了报错大家请复制下载地址使用迅雷下载

后期文章列表(预计本月发布)

整理了快一个月了。自己一边用,一边测试,一边编写使用文档,
1

这是JAVA版快的,预计本月可以发布所有文章,包括源码,demo等等。。。。
1

希望可以帮助到学习java的朋友,后期会整理.NET,PHP,HTML,JAVASCRIPT,Jquery,网络安全。。。。等等方面的资料,如果你有好的文章,或者原创资料,可以联系我帮你发布,大家相互学习!

Pwowerd By:M7lrv

博客文章更新(后期更新)

这段时间上班,没时间更新博客文章,近期我会更新一些原创文章到时候可以给广大小伙伴学习,目前正在整理java方面的文章。先给小伙伴来个预览吧!

希望小伙伴能学到牛逼的技术!每一份文章我都会附带源码和使用方法的!希望广大小伙伴喜欢

1