【更新】Apache Struts2 遠程代碼執行漏洞(CVE-2020-17530)

2021-02-13 深信服千裡目安全實驗室

漏洞名稱 : Apache  Struts2遠程代碼執行漏洞(CVE-2020-17530)

威脅等級 : 高危

影響範圍 : Apache  Struts 2.0.0 - 2.5.25

漏洞類型 : 遠程代碼執行

利用難度 : 中等

Struts2是一個基於MVC設計模式的Web應用框架。在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互Struts2以WebWork為核心,採用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts2可以理解為WebWork的更新產品。

深信服千裡目安全實驗室在2020年12月08日監測到Apache Struts2存在一個遠程代碼執行漏洞(S2-061)。Struts2在某些標籤屬性中使用OGNL表達式時,因為沒有做內容過濾,在傳入精心構造的請求時,可以造成OGNL二次解析,執行指定的遠程代碼。攻擊者可以通過構造惡意請求利用該漏洞,成功利用此漏洞可以造成遠程代碼執行。

在Struts2 2.5.26版本的補丁中,主要進行兩處修補,如下圖。

第一處修補,對S2-061漏洞利用的標籤屬性進行修復。第二處修補,添加了黑名單類。

首先進入org.apache.struts2.views.jsp.ui.AbstractUITag類,重點關注補丁刪除的if代碼塊。If會判斷是否開啟altSyntax,且判斷屬性的value是否為表達式。如果條件滿足,則將key與賦值後的value寫入dynamicAttributes中。

調用org.apache.struts2.views.jsp.ComponentTagSupport#doStartTag方法進行標籤解析,在此方法中調用populateParams,進入父類AbstractUITag的populateParams方法。

在AbstractUITag#populateParams方法中會調用各種uiBean.set方法對屬性進行賦值,最終也會調用uiBean.setDynamicAttributes(dynamicAttributes)方法,對前文選中的動態屬性進行賦值。

最終調用ComponentTagSupport#doEndTag,結束標籤的解析。在調用此方法的過程中會調用engine.renderTemplate(context)方法進行模板渲染。

直接跟進到選擇dynamic-attributes.ftl模板進行頁面渲染,

解析模板中的元素,當解析到<#assign value = struts.translateVariables(keyValue)!keyValue/>時,會調用freemarker.core

.Assignment#accept方法,並在此方法中調用this.valueExp.eval方法,解析env環境變量中的表達式。

最終通過反射調用org.apache.struts2.util.StrutsUtil#translateVariables方法進行ognl表達式解析。

綜上是S2-061的漏洞的表達式注入過程,接下來分析新版本中新增的黑名單類在ognl表達式payload中的作用。

這裡參考Smi1e師傅的文章,選擇黑名單類中,與tomcat相關的org.apache.catalina.core.DefaultInstanceManager類進行分析。

基於tomcat伺服器啟動的struts2框架,在獲取的OgnlContext中的ApplicationMap中可以通過org.apache.tomcat.InstanceManager鍵值,找到對應的org.apache.catalina.core.DefaultInstanceManager類。

DefaultInstanceManager類中存在newInstance方法,利用此方法可以執行任意類中的無參構造方法。

同時,存在一個org.apache.commons.collections.BeanMap類,通過調用setBean方法,將傳入的對象作為bean。

通過調用BeanMap#get(Object name)方法,執行bean中的get方法

通過上述無參構造方法的類的實例化方法,以及類中get方法的調用。可以構造利用鏈,調用com.opensymphony.xwork2.ognl.OgnlValueStack#getContext方法,獲取OgnlContext。

獲取到OgnlContext對象後,可以繼續調用該對象中的get方法,這裡通過調用getMemberAccess方法,獲取_SecurityMemberAccess對象。

此時可以通過模擬Struts2 2.5.2版本的payload,將黑名單清空。最終調用黑名單的類,進行RCE。

搭建Struts 2.5.25版本的環境,運行sniper,填寫表單信息,點擊Attack,效果如圖。

目前受影響的Apache Struts2版本:

Apache Struts 2.0.0 - 2.5.25

目前廠商已發布升級補丁修復漏洞,請受影響用戶及時更新官方補丁。官方連結如下:

https://github.com/apache/struts

深信服下一代防火牆】可輕鬆防禦此漏洞, 建議部署深信服下一代防火牆的用戶更新至最新的安全防護規則,可輕鬆抵禦此高危風險。
深信服雲盾】已第一時間從雲端自動更新防護規則,雲盾用戶無需操作,即可輕鬆、快速防禦此高危風險。
深信服安全感知平臺】可檢測利用該漏洞的攻擊,實時告警,並可聯動【深信服下一代防火牆等產品】實現對攻擊者ip的封堵。
深信服安全運營服務】深信服雲端安全專家提供7*24小時持續的安全運營服務。對存在漏洞的用戶,檢查並更新了客戶防護設備的策略,確保客戶防護設備可以防禦此漏洞風險。

2020/12/08 Apache Struts2官方披露該漏洞

2020/12/08 深信服千裡目安全實驗室檢測該漏洞並發布漏洞安全通告

2020/12/10 深信服千裡目安全實驗室分析復現漏洞,發布漏洞分析文章,並發布產品解決方案

https://github.com/apache/struts

點擊閱讀原文,及時關注並登錄深信服智安全平臺,可輕鬆查詢漏洞相關解決方案。

深信服科技旗下安全實驗室,致力於網絡安全攻防技術的研究和積累,深度洞察未知網絡安全威脅,解讀前沿安全技術。

● 掃碼關注我們

相關焦點

  • 【漏洞分析】 CVE-2021-1665 – Windows GDI+ 中的遠程代碼執行漏洞
    在這篇文章中,我們詳細分析了我們使用 WinAFL 發現的一個此類漏洞的根本原因分析:CVE-2021-1665 – GDI+ 遠程代碼執行漏洞。此問題已於 2021 年 1 月作為 Microsoft 補丁的一部分得到修復。什麼是 WinAFL?
  • Webmin遠程命令執行漏洞預警(CVE-2019-15107)
    長按二維碼關注御見威脅情報中心背景近日,Webmin被爆出1.920版本之前存在一個遠程命令執行漏洞(CVE-2019-15107),當用戶開啟Webmin密碼重置功能後,攻擊者利用該漏洞可在易受損系統中執行任意命令,進而獲取系統Shell。
  • Apache Shiro 權限繞過漏洞 CVE-2020-1957
    對比Shiro 1.4.2與Shiro 1.5.0版本的改動,Shiro在org.apache.shiro.web.filter.PathMatchingFilter類中添加了刪除requestURI結尾的/的代碼。
  • 漏洞情報 | VMware vCenter Server 遠程代碼執行漏洞(CVE-2021-21985)
    VMware vCenter Server是VMware虛擬化管理平臺,廣泛的應用於企業私有雲內網中。
  • F5 RCE(CVE-2020-5902)在野攻擊事件調查
    F5 Networks官方在7月1日公布了BIG-IP系統的TMUI接口中存在一個嚴重的遠程代碼執行漏洞(CVE-2020-5902)
  • 2020攻防演練彈藥庫-您有主機上線請注意
    漏洞簡介2019年9月17日泛微OA官方更新了一個遠程代碼執行漏洞補丁, 泛微e-cology OA系統的Java Beanshell接口可被未授權訪問, 攻擊者調用該Beanshell接口, 可構造特定的HTTP請求繞過泛微本身一些安全限制從而達成遠程命令執行, 漏洞等級嚴重.2. 影響組件泛微OA3.
  • CVE-2019-3462:Linux 包管理器apt/apt-get遠程代碼執行漏洞預警
    apt/apt-get 遠程代碼執行的一些細節。當通過 APT 進行任意軟體的安裝、更新等,默認會走 HTTP 而非 HTTPS,攻擊者可以通過中間人劫持等手法劫持 HTTP 流量,並通過重定向及相關響應頭的構造,完美構造合法的安裝包籤名,以此繞過 APT 本地籤名的判斷。攻擊一旦觸發,便可導致目標伺服器的 root 權限被拿下。360CERT 判斷該漏洞危害嚴重,影響面有限。
  • TP-LINK 遠程代碼執行漏洞 CVE-2017-13772 趣談
    -2017-13772/譯者:hello1900@知道創宇404實驗室本文重點討論作者近期從事 TP-Link WR940N 家用 WiFi 路由器漏洞研究獲得的心得體會,主要從發現漏洞代碼路徑的必要步驟與通過這些路徑實現遠程代碼執行的方式兩方面入手。
  • Apache 'logrotate' 本地提取漏洞分析(CVE-2019-0211)
    apache2-utils=2.4.29-1ubuntu4 apache2-data=2.4.29-1ubuntu4 apache2-dbg=2.4.29-1ubuntu4sudo apt-get -y install software-properties-commonsudo add-apt-repository ppa
  • Adobe修復了Flash Player中的遠程代碼執行漏洞;Intel中漏洞CrossTalk可被利用跨CPU內核洩露數據
    【安全漏洞】Adobe修復了Flash Player中的遠程代碼執行漏洞Intel中漏洞CrossTalk,可被利用跨CPU內核洩露數據【數據洩露】印度國防企業BEML遭到攻擊,其敏感數據在暗網出售【威脅情報】惡意軟體Valak利用新插件竊取用戶Outlook登錄憑據黑客以黑人問題為誘餌發起釣魚攻擊
  • CVE-2018-19518:PHP imap_open函數任意命令執行漏洞復現
    2018-19518/描述PHP 的imap_open函數中的漏洞可能允許經過身份驗證的遠程攻擊者在目標系統上執行任意命令。成功的攻擊可能允許攻擊者繞過其他禁用的exec 受影響軟體中的功能,攻擊者可利用這些功能在目標系統上執行任意shell命令。利用此漏洞的功能代碼是Metasploit Framework的一部分。分析要利用此漏洞,攻擊者必須具有對目標系統的用戶級訪問權限。此訪問要求可以降低成功利用的可能性。
  • 內核漏洞利用之CVE-2020-17382篇(下)
    在本文中,我們將以CVE-2020-17382漏洞為例來介紹內核漏洞是如何被武器化的。在上一篇文章中,我們首先解釋了攻擊者為什麼會以驅動程序為攻擊目標,然後,分析了驅動程序的組成部分,最後,講解了驅動程序的逆向分析和調試方法。在本文中,我們將以CVE-2020-17382漏洞為例為讀者介紹內核漏洞的利用過程。
  • [系統安全] 九.Windows漏洞利用之MS08-067遠程代碼執行漏洞復現及深度提權
    這篇文章將詳細講解MS08-067遠程代碼執行漏洞(CVE-2008-4250),它是Windows Server服務RPC請求緩衝區溢出漏洞,利用445埠,並通過Metasploit工具獲取shell及進行深入的操作。基礎性文章,希望對您有所幫助,真心想把自己近十年的所學所做所感分享出來。與安全人共同進步,加油!也強烈推薦大家去看看參考文獻的視頻和書籍。
  • D-Link-Dir-850L遠程命令執行漏洞
    0x00 背景2017年6月11日hack2Win(網絡設備黑客競賽)舉辦首屆線上比賽,參賽選手可以通過網際網路連入D-Link Dir-850L路由器然後黑掉它,其中有一名選手實現了遠程任意代碼執行
  • 【雲演情報】MIT發現美國選舉大漏洞;LTE爆出新漏洞,黑客可冒充用戶
    當一個action的name被配置成通配符的時候,訪問url,action的名字指定為${exp},action的名字會被作為ongl表達式執行。修復建議:對DefaultActionMapper的類進行安全檢測,過濾非法的注入代碼。Struts2是一個基於MVC設計模式的Web應用框架。攻擊者可以通過操縱參數遠程執行惡意代碼。
  • CVE-2020-15778 Openssh命令注入漏洞復現
    一、關於SCP:scp是用於在計算機之間複製文件的程序。
  • CVE-2019-0708在野利用威脅預警
    此漏洞的相關事件時間線如下:2019年05月14日:微軟官方發布遠程桌面服務遠程代碼執行漏洞(CVE-2019-0708)的安全通告及相應補丁。2019年05月15日:360CERT發布安全預警以及修復指南,360安全實驗室發布漏洞一鍵檢測修復工具。
  • 安全小課堂第102期【web漏洞挖掘之任意命令執行漏洞】
    cmd=ls  來讓ls命令運行這裡與任意代碼執行漏洞稍微有點區別的是,代碼執行漏洞是調用eval這樣的函數執行php代碼。,這裡分享的是 【CVE-2016-3714】ImageMagick遠程代碼執行漏洞ImageMagick是一個免費圖片處理的軟體。
  • 【經典回顧系列】 一步一步教你漏洞挖掘之Windows SMB Ghost CVE-2020-0796(三)
    -0796遠程命令執行利用過程。,關鍵是漏洞能夠破壞或改寫響應報文,利用協議中返回數據的相關函數將信息發回給用戶。Srv2SetResponseBufferToReceiveBuffer`,也就是說當srv2.sys想發送錯誤消息時就會調用該函數。但是在漏洞利用過程中,似乎並不需要利用這點。void Srv2SetResponseBufferToReceiveBuffer( SRV2_WORKITEM *workitem) { ...