Struts2/XWork < 2.2.0遠程執行任意代碼漏洞分析及修補

 

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設置了兩個參數來進行防禦:

  • OgnlContext的屬性 'xwork.MethodAccessor.denyMethodExecution'(默認爲真)
  • SecurityMemberAccess私有字段 'allowStaticMethodAccess'(默認爲假)

爲方便開發人員常常訪問各類對象,XWork定義了不少預約義的上下文變量:

  • #application
  • #session
  • #request
  • #parameters
  • #attr

這些變量表明各類服務器變量。爲了防止攻擊者篡改服務器端對象,XWork的ParametersInterceptor是不容許參數名稱中有#的,大約在一年前,漏洞發現者找到了一種方法來繞過這種保護(XW-641),即經過java的unicode字符串來表示:\u0023。當時感受經過一種方法(OGNL value stack clearing)來修補是不夠的,可是沒有更多的時間來研究。

今年早些時候,漏洞發現者又發現了一些Xwork的一些預約義的變量:

  • #context - 這個方法的可否被調用是基於OgnlContext的 'xwork.MethodAccessor.denyMethodExecution' 屬性的值
  • #_memberAccess - SecurityMemberAccess的'allowStaticAccess' 字段用來防止靜態方法的執行
  • #root
  •  #this
  • #_typeResolver
  • #_classResolver
  •  #_traceEvaluations
  • #_lastEvaluation
  •  #_keepLastEvaluation

使用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用的是人家的核心呢?:)。

轉自:http://neeao.com/archives/59/

相關文章
相關標籤/搜索