Struts2 S2-033漏洞分析

jwf552 8年前發布 | 22K 次閱讀 Struts Struts2 Web框架

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

 

 本文由用戶 jwf552 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!