作者:天融信阿爾法實驗室
公眾號:https://mp.weixin.qq.com/s/9ki_-IjFKybFUx-6FZ-A5g

一、前言

2020年8月13日,Apache官方發布了一則公告,該公告稱Apache Struts2使用某些標簽時,會對標簽屬性值進行二次表達式解析,當標簽屬性值使用了%{skillName}并且skillName的值用戶可以控制,就會造成OGNL表達式執行。

二、漏洞復現

我這里選用的測試環境 Tomcat 7.0.72Java 1.8.0_181Struts 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-029payload里加上%{}就是s2-059payload,具體原因看下面的分析。

三、漏洞分析

根據官網公告的漏洞描述及上面的測試過程可以知道,這次漏洞是由于標簽屬性值進行二次表達式解析產生的。struts2 jsp 標簽解析是org.apache.struts2.views.jsp.ComponentTagSupport類的doStartTagdoEndTag方法。debug跟下 doStartTag方法。

image-20200818174847155

跟下populateParams方法

org/apache/struts2/views/jsp/ui/AnchorTag.class

image-20200818174944494

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

image-20200818175116276

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

image-20200818175306449

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

image-20200818175715249

image-20200818175756449

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

image-20200818182330520

可以看到這里是首先截取去掉%{}字符,然后從stack中尋找payload參數,傳輸的payload參數是%{3*2},這里會得到這個值。

執行完populateParams方法可以得知這個方法是對屬性進行初始化賦值操作。接著跟下start方法

image-20200818182850654

org/apache/struts2/components/Anchor.classstart方法調用了父類org/apache/struts2/components/ClosingUIBean.classstart方法

image-20200818190923090

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

image-20200818191144959

接著調用了populateComponentHtmlId方法

image-20200818191311239

在看下findStringIfAltSyntax方法的實現

org/apache/struts2/components/Component.class$findStringIfAltSyntax

image-20200818191825377

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

image-20200818192259407

整個過程跟S2-029S2-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/


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1302/