Struts2 高危漏洞修复方案 (S2-016/S2-017)
近期Struts2被曝重要漏洞,此漏洞影响struts2.0-struts2.3所有版本,可直接导致服务器被远程控制从而引起数据泄漏,影响巨大,受影响站点以电商、银行、门户、政府居多.
官方描述:
S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017
官方建议修复方案:升级到最新版本 struts-2.3.15.1
但通常现有系统升级,可能导致不稳定及与其他框架比如spring等的不兼容,成本较高。
鉴于此本人整理了一种既可以不用升级现有struts版本,有能完美解决这两个漏洞的方案,
分享如下:
-------------------------
第1步.下载http://jskfs.googlecode.com/files/struts2_(016_017)_bug_repair.rar。
第2步.解压,将src目录中的所有文件,复制到自己项目的src目录中,编译通过
(本例struts是2.0.9版本,实际项目需要根据struts版本做适当调整).
应用服务器会优先加载class目录中的类,自动覆盖jar包中的类.
第3步.web.xml中配置com.htht.commonweb.listener.MyServletContextListener
<listener-class>org.hdht.commonweb.listener.MyServletContextListener</listener-class>
</listener>
第4步.重启服务,修复完毕.
@版权所有,转载请标明出处. http://blog.csdn.net/jzshmyt
附:JavaEEbugRepair.java,完整包参见struts2_(016_017)_bug_repair.rar解压目录
-------------------------
import java.util.Map;
import ognl.MethodAccessor;
import ognl.MethodFailedException;
import ognl.OgnlRuntime;
/**
* @author yanjianzhong(yjz_ok@163.com) 2013/08/08
* @版权所有,转载请标明出处. http://blog.csdn.net/jzshmyt
* download : http://jskfs.googlecode.com/files/struts2_(016_017)_bug_repair.rar
*/
public class JavaEEbugRepair{
/*
* 官方描述:
* S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
* S2_016 bug repair
*/
private static S2_0XX s2_016 = new S2_0XX();
/*
* 修改 ognl.Ognl#parseExpression,调用 check_s2_016 方法
* public static Object parseExpression(String expression)throws OgnlException
* {
* //modify point begin
* if(JavaEEBug.check_s2_016(expression)){
* return null
* }
* //modify point end
* try {
* OgnlParser parser = new OgnlParser(new StringReader(expression));
* return parser.topLevelExpression();
* } catch (ParseException e) {
* throw new ExpressionSyntaxException(expression, e);
* } catch (TokenMgrError e) {
* throw new ExpressionSyntaxException(expression, e);
* }
* }
*/
public static boolean repair_s2_016(String expression){
return s2_016.check(expression);
}
/*
* 在servlet/struts/spring 任何一个框架的listener中调用
*/
public static void initRepair_S2_016(){
OgnlRuntime.setMethodAccessor(Runtime.class, new NoMethodAccessor());
OgnlRuntime.setMethodAccessor(System.class, new NoMethodAccessor());
OgnlRuntime.setMethodAccessor(ProcessBuilder.class,new NoMethodAccessor());
OgnlRuntime.setMethodAccessor(OgnlRuntime.class, new NoMethodAccessor());
s2_016 = new S2_0XX(){
public boolean check(String expression){
String evalMethod[] = {"Runtime", "ProcessBuilder","new File" };
String methodString = null;
methodString = expression.toLowerCase();
for (int i = 0; i < evalMethod.length; i++) {
if (methodString.indexOf(evalMethod[i].toLowerCase()) > -1) {
System.out.print("|OGNL正在执行恶意语句|" + methodString + "|看到这个消息,请联系安全工程师!!!");
return true;
}
}
return false;
}
};
}
/*
* S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017
* S2_017 bug repair
*/
private static S2_0XX s2_017 = new S2_0XX();
/*
* Call by org.apache.struts2.dispatcher.mapper.DefaultActionMapper#handleSpecialParameters
* Repair Example :
* public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping)
* {
* Set uniqueParameters = new HashSet();
* Map parameterMap = request.getParameterMap();
* Iterator iterator = parameterMap.keySet().iterator();
* while (iterator.hasNext()) {
* String key = (String)iterator.next();
*
* if ((key.endsWith(".x")) || (key.endsWith(".y"))) {
* key = key.substring(0, key.length() - 2);
* }
* //modify point begin
* if (JavaEEBug.check_s2_017(key)) {
* return;
* }
* //modify point end
* if (!uniqueParameters.contains(key)) {
* ParameterAction parameterAction = (ParameterAction)this.prefixTrie.get(key);
*
* if (parameterAction != null) {
* parameterAction.execute(key, mapping);
* uniqueParameters.add(key);
* break;
* }
* }
* }
* }
*/
public static boolean repair_s2_017(String key){
return s2_017.check(key);
}
/*
* 在servlet/struts/spring 任何一个框架的listener中调用
*/
public static void initRepair_S2_017(){
s2_017 = new S2_0XX(){
public boolean check(String key){
return (key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:"));
}
};
}
}
/**
* 漏洞验证修复之基类
* 说明:
* 漏洞修复代码的实现逻辑,非侵入式设计。
* 当listener中未调用initRepair_S2_016、initRepair_S2_017进行漏洞调用初始化时,
* 保持Ognl和DefaultActionMapper修复前源码等价逻辑.
*
*/
class S2_0XX {
public boolean check(String key){
return false;
}
}
class NoMethodAccessor implements MethodAccessor {
public NoMethodAccessor() {
}
@Override
public Object callStaticMethod(Map context, Class targetClass,
String methodName, Object[] args) throws MethodFailedException {
throw new MethodFailedException("do not run", methodName, null);
}
@Override
public Object callMethod(Map context, Object target, String methodName,
Object[] args) throws MethodFailedException {
// TODO Auto-generated method stub
throw new MethodFailedException("do not run", methodName,null);
}
}
Struts2 高危漏洞修复方案 (S2-016/S2-017)的更多相关文章
- ThinkPHP 小于5.0.24 远程代码执行高危漏洞 修复方案
漏洞描述由于ThinkPHP5.0框架对Request类的method处理存在缺陷,导致黑客构造特定的请求,可直接GetWebShell. 漏洞评级严重 影响版本ThinkPHP 5.0系列 < ...
- 应用安全-Web安全-漏洞修复方案整理
通过HTTP头部字段防御措施整理 X-Frame-Options #反劫持 X-XSS-Protection #开启浏览器防XSS功能 Set X-Frame-Options CSP X-Conte ...
- URL存在http host头攻击漏洞-修复方案
URL存在http host头攻击漏洞-修复方案 spring boot使用注解的方式 -- 第一步:在自定义filter类上添加如下注释 package com.cmcc.hy.mobile.con ...
- 【渗透测试】NSA Windows 0day漏洞+修复方案
这个漏洞是前段时间爆出来的,几乎影响了全球70%的电脑,不少高校.政府和企业都还在用Windows服务器,这次时间的影响力堪称网络大地震. ------------------------------ ...
- struts2架构网站漏洞修复详情与利用漏洞修复方案
struts2从开发出来到现在,很多互联网企业,公司,平台都在使用apache struts2系统来开发网站,以及应用系统,这几年来因为使用较多,被攻击者挖掘出来的struts2漏洞也越来越,从最一开 ...
- 网站sql注入漏洞修复方案之metinfo 6.1.0系列
近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...
- Struts2 高危漏洞补丁版本为: Struts 2.3.15.1
Struts2 昨天爆出高危漏洞,黑客利用这个漏洞可以执行任意命令(包括恶意的jsp代码),轻松绕过您的验证系统,登陆您的网站后台,使您的网站后台密码形同虚设!! 目前Struts2官方已经发布了一个 ...
- DEDECMS 漏洞修复方案
目录 DEDECMS支付模块注入漏洞 漏洞文件: /include/payment/alipay.php 漏洞描述: 对输入参数$_GET['out_trade_no']未进行严格过滤 修复方案: 对 ...
- Apache Struts2高危漏洞(S2-057CVE-2018-11776)
花了两天时间,特此记录 一:背景: 2018年8月22日,Apache Strust2发布最新安全公告,Apache Struts2存在远程代码执行的高危漏洞. 二:漏洞产生原理: 1.需要知道对应跳 ...
随机推荐
- 【转载】RESTful API 设计指南
作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...
- iOS必学技-cocoapods
我就不再造轮子了,网上的教程很详细,楼主亲测,好用. http://code4app.com/article/cocoapods-install-usage 楼主安装使用过程中遇到以下几个问题,同学们 ...
- RaspberryPi.1.开机与远程桌面
raspberry 3b+ ------------------------------------------------------------------------------- 写系统 有 ...
- 问题:经典类的对象明明没有__class__属性,却可以调用。
这个问题得深入python源码才能看. class a: pass aa =a() print dir(aa)#aa只有doc和module属性 print aa.__class__#__main__ ...
- android ViewPager之PagerAdapter中View的重用
在写PagerAdapter的时候,需要重写instantiateItem(ViewGroup container ,int position) 此方法中,将需要加载的View,添加到conta ...
- nginx_upstream_check_module监控后端服务器http
nginx_upstream_check_module 是专门提供负载均衡器内节点的健康检查的外部模块,由淘宝的姚伟斌大神开发,通过它可以用来检测后端 realserver 的健康状态.如果后端 re ...
- keyspace notification(键空间通知)-待验证
一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 如何使用 Redis 来实现定时任务? 二.序言: 本文所说的定时任务 ...
- ASP.NET MVC 路由学习
参考 http://www.cnblogs.com/yaozhenfa/p/asp_net_mvc_route_2.html 说明 1."解决与物理路径的冲突"这段教程这里如果不起 ...
- Java流程控制练习--万年历
Java流程控制练习--万年历 标签: Java入坑之旅 0x01. 打印倒三角和正三角 public static void main(String[] args) { // TODO Auto-g ...
- Win7下如何使用GCC编译器
很多Linux的爱好者都很熟悉GCC编译器,但是对面初学者,如何去学习GCC使用GCC ,很多人都是直接在电脑上装一个虚拟机,这样不仅安装麻烦,而且占用了很多电脑资源,今天我来教大家如何在Win7使用 ...