Struts2 S2-033漏洞分析
1.介紹
Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與 ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對于WebWork,Struts 2的變化很小。
2. 關于S2-033分析
就是當啟用動態方法調用之后,使用了rest插件就可能執行ognl表達式導致任意代碼執行。
Rest插件使用了之后,ActionMapping是通過org.apache.struts2.rest. RestActionMapper.java的public ActionMapping getMapping(HttpServletRequest request,ConfigurationManager configManager)的方法獲取的。
其中會通過handleDynamicMethodInvocation方法設置ActionMapping的method屬性。
獲取uri中!后面的內容作為ActionMapping的method屬性。但是這個method屬性未做任何處理。導致了后面的代碼執行。
后面的執行流程跟之前分析的S2-032漏洞執行流程一致( http://seclab.dbappsecurity.com.cn/?p=924 ).都是將ActionMapping的屬性設置到ActionProxy中,然后從ActionProxy中獲取method屬性帶入到ognl表達式中執行。從而導致任意代碼執行。
分析github上的修復的版本Struts 2.3.20.3, Struts 2.3.24.3 or Struts 2.3.28.1,發現跟之前版本沒有多大改動,然后查看Struts2 2.5版本的提交紀錄,發現一條更新紀錄。
過濾了struts2-rest插件中RestActionMapper.java的handleDynamicMethodInvocation中的actionMethod屬性
但是分析到安全公告中的修復版本根本對這個漏洞未做任何修補。
如下圖:
官方安全公告中的最新版修復是無效的。
修復方案:關閉動態方法調用
在struts.xml中的<constant name=”struts.enable.DynamicMethodInvocation” value=”true” />改為<constant name=”struts.enable.DynamicMethodInvocation” value=”false” />如果不存在上面的屬性 則不用修改,或者升級到Struts2 2.5
來自: http://wiki.ioin.in/url/lRQ