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.需要知道对应跳 ...
随机推荐
- 【转】详解linux vi命令用法
功能最强在的编辑器--vi vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件.当然,对UNIX系统略有所知的人, 或多或少都觉得vi超级难用,但vi是最基本的编辑器 ...
- 收集SpringBoot的一些学习资料
1:wuyouzhuguli的博客 (24篇) https://github.com/wuyouzhuguli/Spring-Boot-Demos 2:方志鹏的博客 (27篇) https://b ...
- HDU 1431 素数回文 离线打表
题目描述:给定一个区间,将这个区间里所有既是素数又是回文数的数输出来. 题目分析:这题的这个数据范围比较大,达到了10^8级别,而且输入的数据有多组,又因为判断一个数是否是回文数貌似只有暴力判断,时间 ...
- CentOS7 关闭防火墙和selinux
本文将简单介绍在CentOS7上如何临时和永久关闭防火墙和selinux. 关闭防火墙 # 查看防火墙状态 [root@localhost ~]# systemctl status firewalld ...
- CSS text系列
text-shadow 语法规则: h-shadow(必需,水平阴影的位置,可负): v-shadow(必需,垂直阴影的位置,可负): blur(可选,模糊距离): color(可选,阴影的颜色). ...
- Debian安装Nvidia最简单方法
电脑配置: Dell本本 i7+gtx1050+8g 安装bumblebee: sudo apt install bumblebee-nvidia primus 以上会自动安装nvidia驱动. bu ...
- 二维码扫描开源库ZXing定制化【转】
转自:http://www.cnblogs.com/sickworm/p/4562081.html 最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. ...
- Visual Studio 2013/2015/2017快捷键(转)
英文原文:19 Must-Know Visual Studio Keyboard Shortcuts 项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = ...
- 转载:Linux批量远程管理主机命令_pssh用法详解
原文:http://www.linuxidc.com/Linux/2011-12/49635p2.htm (一) 使用前提 中心主机连接远程主机可以通过ssh密钥无密码连接 (二) 命令格式 pssh ...
- eclipse开发mapreduce程序时出现的问题
1.报HDFS权限不够:org.apache.hadoop.security.AccessControlException: Permission denied:user=ouqiping, acce ...