作者:hu4wufu@白帽匯安全研究院
核對:r4v3zn@白帽匯安全研究院
前言
2020年8月13日雖然近幾年來關於ONGL方面的漏洞已經不多了,但是畢竟是經典系列的RCE漏洞,還是有必要分析的。而且對於Struts2和OGNL了解也有助於代碼審計和漏洞挖掘。
首先了解一下什麼是OGNL,Object Graphic Navigation Language(對象圖導航語言)的縮寫,Struts框架使用OGNL作為默認的表達式語言。
struts2_S2_059和S2_029漏洞產生的原理類似,都是由於標籤屬性值進行二次表達式解析產生的,細微差別會在分析中提到。
漏洞利用前置條件是需要特定標籤的相關屬性存在表達式%{payload},且payload可控並未做安全驗證。這裡用到的是a標籤id屬性。
id屬性是該action的應用id。
經過分析,受影響的標籤有很多繼承AbstractUITag類的標籤都會受到影響,受影響的屬性只有id。
環境準備
測試環境:Tomcat 8.5.56、JDK 1.8.0_131、Struts 2.3.24。
由於用Maven創建有錯誤沒有解決,所以選用idea自帶的創建struts2工程。
輸入普通文本:
根據漏洞詳情可知問題出現在標籤解析的時候,所以我們從org.apache.struts2.views.jsp.ComponentTagSupport的doStartTag方法開始跟進,從這裡開始進行jsp標籤的解析。當用戶發送請求的時候,doStartTag()開始執行。我們直接debug斷點在解析標籤的ComponentTagSupport的第一行。
http://blog.topsec.com.cn/struts2-s2-059-%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
https://github.com/ramoncjs3/CVE-2019-0230/commit/40f221f8fd60de78ca84aaf0365b7e4fdfd8105a