新聞中心
2014年4月30日 日前,Struts2再次爆出安全漏洞,主要影響國(guó)內(nèi)電商、銀行、運(yùn)營(yíng)商等諸多大型網(wǎng)站和為數(shù)眾多的政府網(wǎng)站。國(guó)外安全研究人員日前發(fā)現(xiàn),Apache Struts2在處理CVE-2014-0094的漏洞補(bǔ)丁中存在缺陷,會(huì)被輕易繞過(guò),可導(dǎo)致任意命令執(zhí)行。黑客進(jìn)而能夠竊取到網(wǎng)站數(shù)據(jù),或者對(duì)網(wǎng)站進(jìn)行DDoS攻擊。

為淶源等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及淶源網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、淶源網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
本文盤(pán)點(diǎn)了近年來(lái)曝出的高危Struts2漏洞,并分析了Struts2為什么屢屢出現(xiàn)重大安全漏洞。
4年前就存在Struts2代碼執(zhí)行問(wèn)題
Struts2漏洞,這里主要指的是J2EE開(kāi)源框架struts2出現(xiàn)的命令執(zhí)行漏洞,危害巨大,可導(dǎo)致遠(yuǎn)程執(zhí)行任意系統(tǒng)命令,進(jìn)而獲取系統(tǒng)控制權(quán),數(shù)據(jù)庫(kù)控制權(quán),導(dǎo)致信息泄露。所有使用struts2框架開(kāi)發(fā)的系統(tǒng)都受影響。
Struts2的代碼執(zhí)行問(wèn)題最早要追溯到2010年,當(dāng)時(shí)來(lái)自Google安全Team的Meder Kydyraliev發(fā)現(xiàn)可以通過(guò)用unicde編碼的形式繞過(guò)參數(shù)攔截器對(duì)特殊字符“#”的過(guò)濾,造成代碼執(zhí)行問(wèn)題,官方漏洞編號(hào)S2-003,我們可以在struts2官方的漏洞公告中看到如下文字,如圖:
官方給出了利用代碼,但是對(duì)卻忽視了這個(gè)漏洞的威力,因?yàn)楣俜娇吹組eder Kydyraliev給出的代碼以為就是一個(gè)簡(jiǎn)單的bypass,沒(méi)有意識(shí)到利用此漏洞可以遠(yuǎn)程執(zhí)行任意命令,于是隨意修改了一下過(guò)濾規(guī)則便草草了之了。當(dāng)時(shí)apache官方是這樣修補(bǔ)的,他們用正則將含有“\u0023”的請(qǐng)求全部過(guò)濾掉。這樣的修復(fù)根本沒(méi)有起到作用,因?yàn)椤癨u0023”在傳遞過(guò)程中被轉(zhuǎn)義為“\\u0023”所以正則根本沒(méi)匹配上,悲劇的是他們沒(méi)有意識(shí)到這個(gè)問(wèn)題。
好在官方終于發(fā)現(xiàn)了ognl表達(dá)式的威力,ognl可以調(diào)用java靜態(tài)方法,struts2本身就是一個(gè)命令執(zhí)行漏洞,于是他們修改了一些參數(shù)進(jìn)而限制執(zhí)行java靜態(tài)方法。經(jīng)過(guò)研究發(fā)現(xiàn),他們修改了OGNL上下文中一些命名空間中的屬性,比如將#_memberAccess.allowStaticMethodAccess設(shè)置為true,#context["xwork.MethodAccessor.denyMethodExecution"]設(shè)置為false。但是通過(guò)unicde編碼繞過(guò)過(guò)濾規(guī)則的問(wèn)題依然存在。他們以為這樣便萬(wàn)事大吉了。
漏洞頻繁出現(xiàn)
可能是因?yàn)閍pache冷落了Google安全Team,沒(méi)過(guò)多久,Meder Kydyraliev大神便發(fā)飆了,這次他構(gòu)造了一個(gè)可以遠(yuǎn)程執(zhí)行任意命令的利用代碼提交給apache官方,因?yàn)橹皍nicode編碼繞過(guò)的問(wèn)題一直存在,所以還是S2-003的bypass方式,只不過(guò)這次他給出了利用ONGL調(diào)用java靜態(tài)函數(shù)執(zhí)行系統(tǒng)命令的方法,并且在他的blog當(dāng)中給出了詳細(xì)的分析,如圖所示:
blog地址:http://blog.o0o.nu/2010/07/cve-2010-1870-struts2xwork-remote.html
所以S2-003的修復(fù)宣告失敗,此漏洞編號(hào)S2-005,CVE-2010-1870。但是官方的修復(fù)卻很簡(jiǎn)陋,他們重新修改了正則,封堵了Meder Kydyraliev的利用,但是始終沒(méi)有從根本上解決問(wèn)題,他們沒(méi)有意識(shí)OGNL表達(dá)式用八進(jìn)制編碼依然是可以執(zhí)行的,比如”\u0023”換成八進(jìn)制的“\43”,再次繞過(guò)。
這次,apache官方終于意識(shí)到問(wèn)題的嚴(yán)重性,更加嚴(yán)謹(jǐn)?shù)母膶?xiě)了正則,過(guò)濾掉了出現(xiàn)\, @等字符的請(qǐng)求內(nèi)容,官方修改的正則表達(dá)式,如圖所示
但是struts2的問(wèn)題依然存在,不知道過(guò)了多久大概是2011年,Meder Kydyraliev再次發(fā)飆(CVE-2011-3923),他提出新的利用思路,借助action實(shí)例中的私有變量的set方法執(zhí)行OGNL調(diào)用java靜態(tài)方法執(zhí)行任意命令。關(guān)于這個(gè)問(wèn)題,其實(shí)還牽扯出好多web容器的特性,但是危害依然巨大,此漏洞編號(hào)S2-009,CVE-2011-3923,而官方依然是通過(guò)正則過(guò)濾的方式來(lái)修復(fù)此問(wèn)題,官方修復(fù)如圖所示
此后還出現(xiàn)過(guò)S2-013利用struts2標(biāo)簽執(zhí)行ognl的方式,但是這些漏洞都相對(duì)雞肋,影響范圍也就大打折扣了。
事實(shí)上struts2框架底層是利用OGNL表達(dá)式來(lái)實(shí)現(xiàn)的,然而OGNL表達(dá)式的功能過(guò)于強(qiáng)大,導(dǎo)致可以直接調(diào)用java靜態(tài)方法。但是官方為了防止在OGNL表達(dá)式中直接調(diào)用java靜態(tài)方法,它在OGNL上下文中內(nèi)置了幾個(gè)命名對(duì)象。例如,#_memberAccess["allowStaticMethodAccess"]默認(rèn)被設(shè)置為false,#context["xwork.MethodAccessor.denyMethodExecution"]默認(rèn)被設(shè)置為true。
之前的幾個(gè)漏洞使官方意識(shí)到他們做的很多限制都白費(fèi),比如上面提到的這幾個(gè)屬性的值可以利用執(zhí)行OGNL進(jìn)行修改,我們不難看出上面提到的這兩個(gè)漏洞都會(huì)先設(shè)置這兩個(gè)屬性,然后調(diào)用java靜態(tài)方法。
一直到2013年,在S2-013被爆出之后,#_memberAccess["allowStaticMethodAccess"]的屬性,使它沒(méi)有權(quán)限被修改。這樣看似從根本上解決了問(wèn)題。但是他們忘記了利用java反射類(lèi)來(lái)訪(fǎng)問(wèn)私有成員變量這種猥瑣的方法。關(guān)于反射類(lèi)這里順帶說(shuō)一下,在這之前還出現(xiàn)過(guò)例如S2-008命令執(zhí)行,不過(guò)這其實(shí)是Struts2開(kāi)發(fā)模式的一個(gè)特性,嚴(yán)格來(lái)講不能算是漏洞,只不過(guò)在他的處理邏輯當(dāng)中用戶(hù)可以控制執(zhí)行OGNL,但是默認(rèn)struts2的開(kāi)發(fā)模式是關(guān)閉的,所以此漏洞很雞肋。但值得一提的是一直到2014年pwntesting的一篇分析文章中給出S2-008的利用方式,真正利用java反射類(lèi)修改前面那兩個(gè)屬性的奇技淫巧。
另外,還有另一種方法更加干脆,就是java.lang.ProcessBuilder這個(gè)類(lèi),隨便new一個(gè)實(shí)例然后調(diào)用start()方法,便達(dá)到命令執(zhí)行的目的。所以apache改了半天有白忙活了。
關(guān)于比較火的struts2命令執(zhí)行漏洞,在就是去年7月份爆出的S2-016了。關(guān)于這個(gè)漏洞,其實(shí)是DefaultActionMapper類(lèi)支持以"action:"、"redirect:"、"redirectAction:"作為導(dǎo)航或是重定向前綴,但是這些前綴后面同時(shí)可以跟OGNL表達(dá)式,由于struts2沒(méi)有對(duì)這些前綴做過(guò)濾,導(dǎo)致命令執(zhí)行。
一直到最近的S2-020,以及后續(xù)的補(bǔ)丁被繞過(guò),又讓傷痕累累的struts2火了一把,但是這次問(wèn)題不是出在ognl執(zhí)行上,而是換成了操控容器的classLoader屬性,這個(gè)其跟前面提到的S2-009有點(diǎn)類(lèi)似,因?yàn)閟truts2框架有這樣一個(gè)特性,只要接受到用戶(hù)提交aa=bb這樣的請(qǐng)求時(shí),就會(huì)通過(guò)OGNL去執(zhí)行對(duì)應(yīng)的setaa方法,所以當(dāng)用戶(hù)去提交class.classLoader….這樣的參數(shù)時(shí),當(dāng)然可以操控對(duì)應(yīng)classLoader的屬性,至于classLoader,不同的容器有不同的屬性,能夠控制這些屬性是很危險(xiǎn)的,比如tomcat的docBase可以控制根目錄的位置等等。
關(guān)于S2-020的修復(fù),官方發(fā)揚(yáng)了他們一貫的作風(fēng),繼續(xù)使用正則表達(dá)式這種“高端“技術(shù)過(guò)濾用戶(hù)請(qǐng)求,可惜這次又沒(méi)過(guò)濾好,被人家用各種奇技淫巧繞過(guò)。就這個(gè)問(wèn)題來(lái)言,我想對(duì)struts2的開(kāi)發(fā)人員說(shuō),你們什么時(shí)候能夠關(guān)注一下底層代碼呀。至于在S2-020補(bǔ)丁被繞過(guò)之后的修復(fù),官方無(wú)奈還是用正則,但是這次他們總算確認(rèn)要從根本上修復(fù)框架問(wèn)題,所以坐等apache出最終補(bǔ)丁吧。
Apache官方難辭其咎
回顧struts2的漏洞歷史,我們發(fā)現(xiàn)官方難辭其咎,首先,開(kāi)發(fā)人員安全意識(shí)不強(qiáng),雖然采取了基本的安全措施,但是形同虛設(shè)。其次,官方修復(fù)力度不夠,給我的感覺(jué)總像是在敷衍了事,未能從根本上解決問(wèn)題。再就是,官方的開(kāi)放精神確實(shí)很震撼,竟然直接將漏洞的PoC掛在官網(wǎng),這樣給了很多人進(jìn)一步研究漏洞利用的機(jī)會(huì),這個(gè)也是導(dǎo)致問(wèn)題更加嚴(yán)重的一個(gè)原因。其實(shí)責(zé)任很明顯,apache官方的問(wèn)題。在這里我想提醒廣大java開(kāi)發(fā)人員以及系統(tǒng)運(yùn)維人員,面對(duì)這么一個(gè)漏洞百出的框架,你還敢用嗎,還是早日換掉這個(gè)危險(xiǎn)的struts2吧!
近兩年關(guān)于struts2的攻擊事件頻發(fā),攻擊面覆蓋各大門(mén)戶(hù)網(wǎng)站,包括向移動(dòng)、電信、聯(lián)通、各大網(wǎng)銀、證券等等,因?yàn)閟truts2是一款功能非常強(qiáng)大的j2ee框架,特別是對(duì)于廣大開(kāi)發(fā)人員,應(yīng)用非常廣泛。所以一旦struts2出現(xiàn)0day,導(dǎo)致互聯(lián)網(wǎng)上出現(xiàn)大面積被入侵、被拖庫(kù),信息泄露等事件。對(duì)于此問(wèn)題,專(zhuān)家建議相關(guān)技術(shù)人員應(yīng)及時(shí)更新struts2框架版本。如果有能力,最好自己去開(kāi)發(fā)應(yīng)用框架,避免使用開(kāi)源框架。
struts2漏洞盤(pán)點(diǎn)
影響比較大,利用比較廣泛的struts2漏洞:
2010年 S2-005
CVE-2010-1870 XWork ParameterInterceptors bypass allows OGNLstatement execution
2012年1月 S2-008
CVE-2012-0392 struts2 DevMod Remote Command Execution Vulnerability
2012年1月 S2-009
CVE-2011-3923 Struts<=2.3.1參數(shù)攔截器代碼執(zhí)行
2013年 5月 S2-013
CVE-2013-1966 Struts2 <= 2.3.14 includeParams屬性遠(yuǎn)程命令執(zhí)行漏洞
2013年7月 S2-016
CVE-2013-2251 Struts2 <= 2.3.15.1 action、redirect、redirectAction前綴遠(yuǎn)程命令執(zhí)行漏洞
2014年3月 S2-020
Struts2 <= 2.3.16 DoS attacks and ClassLoader manipulation
2014年4月 S2-021
Struts2 <= 2.3.16.1 bypass patch(ClassLoader manipulation)
具體參照struts2官網(wǎng)提供的漏洞歷史:
https://cwiki.apache.org/confluence/display/WW/Security+Bulletins
本文題目:Struts2安全漏洞頻出多因Apache官方代碼編寫(xiě)不嚴(yán)謹(jǐn)
文章出自:http://www.5511xx.com/article/cosoigh.html


咨詢(xún)
建站咨詢(xún)
