自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一種新的攻擊方法——Java Web表達(dá)式注入

安全 黑客攻防 應(yīng)用安全
本文筆者向各位介紹一種新的攻擊方法,我們可能會(huì)在未來(lái)很長(zhǎng)的一段時(shí)間內(nèi)和它打交道,就像我們當(dāng)初和SQL注入、代碼執(zhí)行、命令執(zhí)行這些一樣。它的名字叫做Java Web Expression Language Injection——Java Web 表達(dá)式注入。

0×00 引言

在2014年6月18日@終極修煉師曾發(fā)布這樣一條微博:

新攻擊方法--Java Web Expression Language Injection

鏈接的內(nèi)容是一個(gè)名為Jenkins的服務(wù),可以在沒(méi)有password的情況下受到攻擊。而攻擊方法比較有趣,Jenkins提供了一個(gè)Script Console功能,可以執(zhí)行Groovy 腳本語(yǔ)言。下面我們來(lái)看下維基百科對(duì)于這個(gè)腳本語(yǔ)言的解釋?zhuān)?

 Groovy是Java平臺(tái)上設(shè)計(jì)的面向?qū)ο缶幊陶Z(yǔ)言。這門(mén)動(dòng)態(tài)語(yǔ)言擁有類(lèi)似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺(tái)的腳本語(yǔ)言使用。

Groovy的語(yǔ)法與Java非常相似,以至于多數(shù)的Java代碼也是正確的Groovy代碼。Groovy代碼動(dòng)態(tài)的被編譯器轉(zhuǎn)換成Java字節(jié)碼。由于其運(yùn)行在JVM上的特性,Groovy可以使用其他Java語(yǔ)言編寫(xiě)的庫(kù)。

比較巧的是,我前一段時(shí)間因?yàn)樵陉P(guān)注表達(dá)式注入這個(gè)攻擊方向,也研究了下Groovy這個(gè)語(yǔ)言。這個(gè)語(yǔ)言簡(jiǎn)單而強(qiáng)大,我可以直接用一個(gè)字符串來(lái)執(zhí)行系統(tǒng)命令。下面是一個(gè)demo:

  1. java  
  2. class demo {  
  3. static void main(args){  
  4. def cmd = "calc";  
  5. println "${cmd.execute()}";  
  6. }  

新攻擊方法--Java Web Expression Language Injection

如果單純的看Jenkins的這個(gè)問(wèn)題,可能只是覺(jué)得這是一個(gè)比較有趣的攻擊手法。但如果我們?cè)俾?lián)想一下之前的一些漏洞,就會(huì)發(fā)現(xiàn)這些個(gè)體之間是存在某種聯(lián)系的。

 2014年5月:CVE-2014-3120,ELASTICSEARCH遠(yuǎn)程代碼代碼漏洞

2013年5、6、7月:Struts2多個(gè)OGNL導(dǎo)致的遠(yuǎn)程命令執(zhí)行漏洞

2012年12月:國(guó)外研究者@DanAmodio發(fā)布《Remote-Code-with-Expression-Language-Injection》一文

這些事件的串聯(lián)導(dǎo)致了我打算寫(xiě)下這篇文章,來(lái)向各位介紹這種新的攻擊方法(雖然實(shí)際上,它已經(jīng)存在了很久),我們可能會(huì)在未來(lái)很長(zhǎng)的一段時(shí)間內(nèi)和它打交道,就像我們當(dāng)初和SQL注入、代碼執(zhí)行、命令執(zhí)行這些一樣。

它的名字叫做Java Web Expression Language Injection——Java Web 表達(dá)式注入

0×01 表達(dá)式注入概述

2013年4月15日Expression Language Injection詞條在OWASP上被創(chuàng)建,而這個(gè)詞的最早出現(xiàn)可以追溯到2012年12月的《Remote-Code-with-Expression-Language-Injection》一文,在這個(gè)paper中第一次提到了這個(gè)名詞。

而這個(gè)時(shí)期,我們其實(shí)也一直在響應(yīng)這個(gè)新型的漏洞,只不過(guò)我們還只是把它叫做遠(yuǎn)程代碼執(zhí)行漏洞、遠(yuǎn)程命令執(zhí)行漏洞或者上下文操控漏洞。像Struts2系列的s2-003、s2-009、s2-016等,這種由OGNL表達(dá)式引起的命令執(zhí)行漏洞。

而隨著Expression Language越來(lái)越廣泛的使用,它的受攻擊面也隨著展開(kāi),所以我們覺(jué)得有必要開(kāi)始針對(duì)這種類(lèi)型的漏洞進(jìn)行一些研究,Expression Language Injection在將來(lái)甚至有可能成為SQL注入一樣的存在。

而且從OWASP中定義的表達(dá)式注入以及《Remote-Code-with-Expression-Language-Injection》這篇paper所提到的表達(dá)式注入所面向的服務(wù),可以看出這種漏洞,在目前的web現(xiàn)狀中,只存在于Java Web服務(wù)。而在未來(lái)的web發(fā)展中,其他的Web方向也有可能出現(xiàn)表達(dá)式的存在,所以我們?yōu)榱酥?jǐn)慎起見(jiàn),將這個(gè)稱(chēng)為Java Web Expression Language Injection。

從以往的這種形式的漏洞來(lái)看,這種漏洞的威力往往都非常大,最典型的就像Struts2的OGNL系列漏洞。而漏洞的形成原因,一般是功能濫用或者過(guò)濾不嚴(yán)這兩種,比較代表性的例子是Struts2的s2-16(功能濫用)和s2-009(過(guò)濾不嚴(yán))。

0×02 一些流行的表達(dá)式語(yǔ)言

我們?cè)谌ツ甑臅r(shí)候做過(guò)一個(gè)關(guān)于Java Web的研究課題,對(duì)于一些Java Web框架和程序進(jìn)行過(guò)比較深入的研究。而且對(duì)于Java Web 表達(dá)式注入(后面簡(jiǎn)稱(chēng)JWEI)也做了一點(diǎn)積累,在這小節(jié)中我覺(jué)得有必要向各位介紹一下它們,以方便日后研究工作的開(kāi)始。

下面我將用盡量簡(jiǎn)單的語(yǔ)言來(lái)向各位介紹幾種簡(jiǎn)單的流行表達(dá)式語(yǔ)言和它們的基本用法(攻擊相關(guān)),以及它們?cè)?jīng)導(dǎo)致的漏洞。

Struts2——OGNL

實(shí)至名歸的“漏洞之王”,目前被攻防雙方理解得足夠透徹的唯一表達(dá)式語(yǔ)言。

基本用法:

java
ActionContext AC = ActionContext.getContext();
Map Parameters = (Map)AC.getParameters();
String expression = "${(new java.lang.ProcessBuilder('calc')).start()}";
AC.getValueStack().findValue(expression));

相關(guān)漏洞:

s2-009、s2-012、s2-013、s2-014、s2-015、s2-016,s2-017

Spring——SPEL

SPEL即Spring EL,故名思議是Spring框架專(zhuān)有的EL表達(dá)式。相對(duì)于其他幾種表達(dá)式語(yǔ)言,使用面相對(duì)較窄,但是從Spring框架被使用的廣泛性來(lái)看,還是有值得研究的價(jià)值的。而且有一個(gè)Spring漏洞的命令執(zhí)行利用,讓漏洞發(fā)現(xiàn)者想得腦袋撞墻撞得梆梆響都沒(méi)想出來(lái),而我卻用SPEL解決了,大家來(lái)猜下是哪個(gè)漏洞呢^_^。

基本用法:

java
String expression = "T(java.lang.Runtime).getRuntime().exec(/"calc/")";
String result = parser.parseExpression(expression).getValue().toString();

相關(guān)漏洞:

暫無(wú)公開(kāi)漏洞

JSP——JSTL_EL

這種表達(dá)式是JSP語(yǔ)言自帶的表達(dá)式,也就是說(shuō)所有的Java Web服務(wù)都必然會(huì)支持這種表達(dá)式。但是由于各家對(duì)其實(shí)現(xiàn)的不同,也導(dǎo)致某些漏洞可以在一些Java Web服務(wù)中成功利用,而在有的服務(wù)中則是無(wú)法利用。

例如:《Remote-Code-with-Expression-Language-Injection》一文中所提到的問(wèn)題,在glassfish和resin環(huán)境下是可以成功實(shí)現(xiàn)命令執(zhí)行的,而在tomcat的環(huán)境下是沒(méi)有辦法實(shí)現(xiàn)的。

而且JSTL_EL被作為關(guān)注的對(duì)象,也是由于它的2.0版本出現(xiàn)之后,為滿(mǎn)足需求,這個(gè)版本在原有功能的基礎(chǔ)之上,增加了很多更為強(qiáng)大的功能。

從這點(diǎn)中我們不難看出,隨著未來(lái)的發(fā)展,對(duì)于表達(dá)式語(yǔ)言能實(shí)現(xiàn)比較強(qiáng)大的功能的需求越來(lái)越強(qiáng)烈,主流的表達(dá)式語(yǔ)言都會(huì)擴(kuò)展這些功能。而在擴(kuò)展之后,原來(lái)一些不是問(wèn)題的問(wèn)題,卻成了問(wèn)題。

基本用法:

 

  1. jsp  
  2. <spring:message text=
  3. "${/"/".getClass().forName(/"java.lang.Runtime/").getMethod(/"getRuntime/",null).invoke(null,null).exec(/"calc/",null).toString()}">
  4. </spring:message> 

 

相關(guān)漏洞:

CVE-2011-2730

Elasticsearch——MVEL

首先要感謝下Elasticsearch的CVE-2014-3120這個(gè)漏洞,因?yàn)楦欉@個(gè)漏洞時(shí),讓我開(kāi)始重新關(guān)注到Java Web表達(dá)式研究的價(jià)值,并決定開(kāi)始向這個(gè)方向作深入的研究。

MVEL是同OGNL和SPEL一樣,具有通過(guò)表達(dá)式執(zhí)行Java代碼的強(qiáng)大功能。

基本用法:

  1. java import org.mvel.MVEL;  
  2. public class MVELTest {  
  3.         public static void main(String[] args) {  
  4.               String expression = "new java.lang.ProcessBuilder(/"calc/").start();";  
  5.                Boolean result = (Boolean) MVEL.eval(expression, vars);  
  6.          }  
  7.   }  

相關(guān)漏洞:

CVE-2014-3120

0×03 總結(jié)

在未來(lái)針對(duì)表達(dá)式語(yǔ)言開(kāi)展的研究中,我準(zhǔn)備將研究表達(dá)式語(yǔ)言定位為和SQL語(yǔ)法一樣的利用方法研究。從我們上面對(duì)于表達(dá)式語(yǔ)言分析的結(jié)果來(lái)看,JWEI攻擊和SQL注入攻擊很像。

多種平臺(tái)風(fēng)格,但是基本的語(yǔ)法一定 多數(shù)情況下是由于拼接問(wèn)題,或用戶(hù)直接操控表達(dá)式,從而造成的攻擊 由此我們未來(lái)的研究,會(huì)將Java Web表達(dá)式語(yǔ)言作為一種利用方法來(lái)研究。

而JWEI漏洞的研究,我們會(huì)通過(guò)研究程序員在編程中如何使用表達(dá)式語(yǔ)言來(lái)進(jìn)行。具體的操作方法,會(huì)是閱讀研究的表達(dá)式語(yǔ)言所對(duì)應(yīng)的框架代碼。試圖從中找到一些規(guī)律和習(xí)慣。最終總結(jié)出一些針對(duì)表達(dá)式注入漏洞挖掘和利用方法。

0×04 擴(kuò)展延伸

在研究表達(dá)式語(yǔ)言時(shí),翻閱以往Java Web資料的過(guò)程中,我還發(fā)現(xiàn)了一些Java Web漏洞的小細(xì)節(jié)。這些細(xì)節(jié)可能沒(méi)有表達(dá)式語(yǔ)言這么通用,但也是Java Web中不可忽略的潛在漏洞點(diǎn)。

反序列化代碼執(zhí)行

序列化是Java的一個(gè)特性,在Web服務(wù)中也經(jīng)常用來(lái)傳輸信息,這就導(dǎo)致攻擊者有可能通過(guò)出傳遞帶有惡意序列化內(nèi)容的代碼實(shí)現(xiàn)攻擊。典型的漏洞有Spring的CVE-2011-2894和JBoss的CVE-2010-0738。

利用Java反射觸發(fā)命令執(zhí)行

反射是Java的一個(gè)大特性,如果在開(kāi)發(fā)過(guò)程中沒(méi)有針對(duì)對(duì)象的行為進(jìn)行嚴(yán)格的限制的話(huà),用戶(hù)就有可能通過(guò)操控一些可控對(duì)象,利用反射機(jī)制觸發(fā)命令執(zhí)行攻擊。典型的漏洞有CVE-2014-0112。

利用框架某些特性實(shí)現(xiàn)代碼執(zhí)行

這種形式的攻擊,根據(jù)框架的某些特性才能進(jìn)行,而大部分框架的功能實(shí)現(xiàn)是有很大的不同的,所以此類(lèi)攻擊定制性很強(qiáng)。不過(guò),框架之間還是有一些共同性的,譬如自定義標(biāo)簽庫(kù)的實(shí)現(xiàn)和調(diào)用,都是大同小異的。典型漏洞有CVE-2010-1622。

責(zé)任編輯:藍(lán)雨淚 來(lái)源: 烏云知識(shí)庫(kù)
相關(guān)推薦

2017-02-20 09:00:49

2019-03-13 08:56:07

JavaSpEL表達(dá)式注入

2018-12-14 14:30:12

安全檢測(cè)布式系測(cè)試

2017-12-11 10:40:14

2009-06-09 09:00:09

java正則表達(dá)式

2009-02-17 09:10:01

正則表達(dá)式Java優(yōu)化

2012-06-26 10:03:58

JavaJava 8lambda

2021-05-05 11:31:15

JDK新特性Lambda表達(dá)式Java8

2010-03-12 18:36:28

Python正則表達(dá)式

2022-06-13 14:05:39

攻擊PACMANM1 處理器

2014-01-05 17:41:09

PostgreSQL表達(dá)式

2010-07-14 09:24:22

Perl正則表達(dá)式

2016-11-10 16:21:22

Java 正則表達(dá)式

2016-12-26 16:46:12

2024-01-18 15:38:17

語(yǔ)言模型大型語(yǔ)言模型

2023-06-01 12:48:52

Java正則表達(dá)式

2024-03-25 13:46:12

C#Lambda編程

2010-07-19 16:11:20

Perl正則表達(dá)式

2009-08-13 09:47:57

調(diào)用JSP EL表達(dá)式帶參數(shù)方法

2023-12-28 08:00:40

lambda表達(dá)式Java 8
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)