作者: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