作者:天融信阿爾法實驗室
公眾號:https://mp.weixin.qq.com/s/9ki_-IjFKybFUx-6FZ-A5g
一、前言
2020年8月13日,Apache官方發布了一則公告,該公告稱Apache Struts2使用某些標簽時,會對標簽屬性值進行二次表達式解析,當標簽屬性值使用了%{skillName}并且skillName的值用戶可以控制,就會造成OGNL表達式執行。
二、漏洞復現
我這里選用的測試環境 Tomcat 7.0.72、Java 1.8.0_181、Struts 2.2.1,受影響的標簽直接使用官網公告給出的例子
<s:url var="url" namespace="/employee" action="list"/><s:a id="%{payload}" href="%{url}">List available Employees</s:a>
測試漏洞URL
http://localhost:8088/S2-059.action?payload=%25{3*3}
在s2-029中由于調用了completeExpressionIfAltSyntax方法會自動加上"%{" + expr + "}",所以payload不用帶%{},在s2-029的payload里加上%{}就是s2-059的payload,具體原因看下面的分析。
三、漏洞分析
根據官網公告的漏洞描述及上面的測試過程可以知道,這次漏洞是由于標簽屬性值進行二次表達式解析產生的。struts2 jsp 標簽解析是org.apache.struts2.views.jsp.ComponentTagSupport類的doStartTag和doEndTag方法。debug跟下 doStartTag方法。

跟下populateParams方法
org/apache/struts2/views/jsp/ui/AnchorTag.class

這里又去調用了父類的populateParams方法,接著調用org/apache/struts2/views/jsp/ui/AbstractUITag.class類的populateParams方法

可以看到這里有給setId賦值,跟下setId方法,org/apache/struts2/components/UIBean.class

由于id不為null,會執行this.findString方法,接著跟下.org/apache/struts2/components/Component.class


altSyntax默認開啟, 所以this.altSyntax()會返回true,toType的值傳過來是String.class,if條件成立會執行到TextParseUtil.translateVariables('%', expr, this.stack)

可以看到這里是首先截取去掉%{}字符,然后從stack中尋找payload參數,傳輸的payload參數是%{3*2},這里會得到這個值。
執行完populateParams方法可以得知這個方法是對屬性進行初始化賦值操作。接著跟下start方法

org/apache/struts2/components/Anchor.class的start方法調用了父類org/apache/struts2/components/ClosingUIBean.class的start方法

在接著跟下org/apache/struts2/components/UIBean.class$evaluateParams方法

接著調用了populateComponentHtmlId方法

在看下findStringIfAltSyntax方法的實現
org/apache/struts2/components/Component.class$findStringIfAltSyntax

可以看到這里又執行了一次TextParseUtil.translateVariables方法.

整個過程跟S2-029和S2-036漏洞產生的原因一樣,都是由標簽屬性二次表達式解析造成漏洞。分析完漏洞產生原因后,我查看了UIBean class相關代碼,并沒有發現除id外其它標簽屬性值可以這樣利用。
四、總結
此次漏洞需要開啟altSyntax功能,只能是在標簽id屬性中存在表達式,并且參數還可以控制,這種場景在實際開發中非常少見,危害較小。
五、參考鏈接
https://cwiki.apache.org/confluence/display/WW/S2-059
http://blog.topsec.com.cn/struts2%e6%bc%8f%e6%b4%9es2-029%e5%88%86%e6%9e%90/
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1302/
暫無評論