作者:廖新喜
公眾號:廖新喜

Struts2 CVE-2018-11776 S2-057 RCE Ognl

漏洞公告

北京時間8月22日13時,Apache官方發布通告公布了Struts2中一個遠程代碼執行漏洞(CVE-2018-11776)。該漏洞在兩種情況下存在,第一,在xml配置中未設置namespace值,且上層動作配置(upper action(s) configurations)中未設置或用通配符namespace值。第二,使用未設置 value和action值的url標簽,且上層動作配置(upper action(s) configurations)中未設置或用通配符namespace值。

補丁對比

如圖所示,補丁主要添加了cleanNamespaceName方法,該方法通過白名單的方式來驗證namespace是否合法,從官方描述和漏洞修復方式來看,該漏洞應該是一個Ognl的表達式注入漏洞

動態分析

漏洞發布幾個小時之后,漏洞發現作者公布了整個發現過程,并且詳細分析了一種漏洞情形:https://lgtm.com/blog/apachestrutsCVE-2018-11776 按照該博客的說法,拉取struts2-showcase項目作為示例,修改struts-actionchaining.xml,具體如下:

<struts>
    <package name="actionchaining" extends="struts-default" >
        <action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1">
            <result type="redirectAction">
                <param name="actionName">register2</param>
            </result>
        </action>
    </package>
</struts>

在這種情況下,所有到actionChain1.action的請求的返回結果都會指向register2,并且執行鏈會到ServletActionRedirectResult.execute方法中,具體如下:

從上圖可以看出,通過namespace字段,污染了tmpLocation字典,并且設置為了預期的執行的PoC,這也是補丁中為什么要凈化namespace的原因,繼續跟蹤namespace的去向,執行鏈會到ServletActionRedirectResult的父類的父類StrutsResultSupport.execute方法中,具體如下圖

這里有個conditionParse方法,這個方式就是使用Ognl表達式來計算數據值,在系統中用得非常多,而且在一些歷史漏洞中,也應該由它來背鍋,當然最大的鍋還是struts官方,每次漏洞出在哪就修在哪,典型的頭痛醫頭,腳痛醫腳。方法實現如下圖所示

在這個方法中會使用到TextParseUtil.translateVariables方法,繼續跟蹤,調用棧進入OgnlTextParser中的evaluate方法,首先會判斷傳入的表達式是否合法,比如是否能找到${}或者%{}對,接著調用evaluator.evaluate求值,求值過程非常復雜,總得來說就是鏈式執行過程,具體如下調用棧:

從上圖也可以看出最頂層就是通過反射的方式來調用ProcessBuilder的構造函數,中間部分就是鏈式執行過程中牽涉到一些操作。

我們可以看下求值過程中參數的一些情況。來查看Ognl安全加固的一些變化,具體如下圖:

主要是黑名單上又添加了一些類,分別是 classognl.DefaultMemberAccessclasscom.opensymphony.xwork2.ognl.SecurityMemberAccessclassjava.lang.ProcessBuilder

分析就結束了,計算器還是要彈的,如下圖:

PoC 構造

這塊是最難的,也是最不好調試的,利用showcase項目很早就能執行${(1+1)}=2的效果,但是要彈出計算器,并不容易,其實就是新的沙箱的繞過,當時在調試的時候就發現,每次的返回結果都是空,沒辦法,只能耐著性子,將原先的PoC進行拆分,一個單元的一個單元的測試。測試獲取#context的時候總為空,后來發現導致無法獲取OgnlUtil的實例,怎么獲取context,有多種方式,從代碼結構來看可以從ognl表達式一些固有表達式來獲取,如#root,#request等。


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