漏洞名稱 : 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
點擊閱讀原文,及時關注並登錄深信服智安全平臺,可輕鬆查詢漏洞相關解決方案。
深信服科技旗下安全實驗室,致力於網絡安全攻防技術的研究和積累,深度洞察未知網絡安全威脅,解讀前沿安全技術。
● 掃碼關注我們