Spring WebFlow 遠程代碼執行漏洞分析
Spring嚴重的漏洞歷來都不算多,之前比較嚴重的那個問題是Spring的JavaBean的自動綁定功能,導致可以控制class,從而導致可以利用某些特性執行任意代碼,但是那個漏洞比較雞肋,不是每次都能觸發。
由於Spring的框架越來越多,而且後面引入了SpringEl作為默認的表達式解析方式,所以一旦引入了類似於OGNL的表達式,很可能會帶來一些安全問題,本次漏洞就是由於Spring WebFlow的數據綁定問題帶來的表達式注入,從而導致任意代碼執行。
漏洞簡介
這個漏洞在今年6月初剛被提交https://pivotal.io/security/cve-2017-4971 ,官方並沒有詳細的信息,通過官方描述和補丁的對比,我們可以大致推斷應該是Spring WebFlow在Model的數據綁定上面,由於沒有明確指定相關model的具體屬性導致從表單可以提交惡意的表達式從而被執行,導致任意代碼執行的漏洞,這個漏洞利用除了版本的限制之外還有兩個前置條件,這兩個前置條件中有一個是默認配置,另外一個就是編碼規範了,漏洞能不能利用成功主要就取決於後面的條件。
整體來說這個漏洞危害應該還是有一些的,如果滿足2個前置條件,那麼直接RCE是沒什麼問題的。在分析這個漏洞之前需要一些Spring Webflow的基礎知識,給大家推薦這篇文章https://www.ibm.com/developerworks/cn/education/java/j-spring-webflow/index.html 。
漏洞分析
一開始我也不清楚這個漏洞到底是怎麼觸發,對於這個漏洞的理解,最好去看下Spring WebFlow的教程,搞明白裡面的view-state是啥,這裡不過多對Spring WebFlow的基礎知識過多解釋,那麼我們直接看補丁,如下圖
我們發現這裡對 addEmptyValueMapping(DefaultMapper mapper, String field, Object model) 這個方法裡面表達式解析的實現類進行了替換,直接使用了BeanWrapperExpressionParser來解析,關於這個類我們後面再詳細說,那麼知道觸發漏洞的函數後,我們就可以用Eclipse或者Spring Tools來跟蹤下函數調用棧,具體如下:
通過調用關係我們可以發現一共有以下兩個函數調用了addEmptyValueMapping方法
addDefaultMappings(DefaultMapper mapper, Set parameterNames, Object model)
這裡通過調用關係我們可以大概的搞明白Spring WebFlow的執行順序和流程,由flowcontroller決定將請求交給哪個handler去執行具體的流程,這裡我們需要知道當用戶請求有視圖狀態處理時,會決定當前事件下一個執行的流程,同時對於配置文件中我們配置的view-state元素,如果我們指定了數據的model,那麼它會自動進行數據綁定,xml結構如下(這裡以官方的example中的book項目為例子)
言歸正傳,本次漏洞出現的原因就是在view-state節點中數據綁定上,我們繼續跟蹤addEmptyValueMapping方法的調用過程,這裡通過eclipse我們可以發現bind方法間接的調用了addEmptyValueMapping函數,
到這裡我們知道了addEmptyValueMapping函數存在表達式執行的點,我們現在來詳細看下這個addEmptyValueMapping函數,如下圖
這裡我們可以看見,只有控制了field參數才能出發漏洞,所以我們重點是找到有沒有點我們可以控制從而控制field參數來進行任意代碼執行,這裡明確目標後,我們回過頭來看addDefaultMappings和addModelBindings這兩個函數,既然這兩個函數都調用了存在缺陷的函數,那麼我們看看這兩個函數的區別是什麼,而且那個函數能能能控制field參數,兩個函數的區別如下
這裡比較明顯的區別就是addModelBindings函數中 for (Binding binding : binderConfiguration.getBindings()) 存在這樣一個循環,而且就是這個循環的控制決定了field參數的值,經過進一步分析,這裡控制field的參數的決定性因素就是binderConfiguration這個變數所控制的值,這裡經過源碼的跟蹤我們可以發現,binderConfiguration函數的值就是webflow-*.xml中view-state中binder節點的配置,所以這個函數的值來源於配置文件,所以這個函數我們無法控制,從而無法觸發漏洞,所以我們重點來看看addDefaultMappings這個函數,我們發現addDefaultMappings中我們可以控制field參數,所以我們重點來看看如何去觸發這個函數。
現在我們基本上可以確定了addDefaultMappings函數是我們觸發漏洞的關鍵點,那麼如上圖所示,bing函數中調用了這兩個函數,那麼我們可以看出只有當binderConfiguration為空的時候才能觸發我們的漏洞,那麼我們剛才也說了binderConfiguration這個值是由配置文件中是否有binder節點來控制的(這裡需要注意的是程序執行到bind方法的前置條件是view-state節點中是否配置了model屬性,即綁定的javabean對象是什麼),而且addDefaultMappings函數中parameterNames參數就是我們從表單中傳遞的值,所以到這裡漏洞的觸發流程和觸發條件基本上清楚了,觸發條件如下:
在webflow配置文件中view-state節點中指定了model屬性,並且沒有指定綁定的參數,即view-state中沒有配置binder節點
而且MvcViewFactoryCreator類中useSpringBeanBinding默認值(false)未修改
這裡為什麼一定要useSpringBeanBinding的值為false,我們來看一下addEmptyValueMapping函數,這裡的expressionParser變數的聲明類是ExpressionParser介面,那麼決定最後 expressionParser.parseExpression(field, parserContext)這個函數來執行任意表達式是這個變數的賦值,那麼在spring webflow中這個expressionParser的默認值就是WebFlowELExpressionParser的實例,這個類表達式默認的解析是有spel來執行的,具體可以去跟蹤函數,那麼在org.springframework.webflow.mvc.builder.MvcViewFactoryCreator.createViewFactory(Expression, ExpressionParser, ConversionService, BinderConfiguration, Validator, ValidationHintResolver)這個類如下圖
我們可以看見如果useSpringBeanBinding這個屬性為false那麼就使用默認的解析類,如果這個值為true就由BeanWrapperExpressionParser這個類來解析,這個類的parseExpression函數我們來看看
首先決定了能不能執行的第一個控制變數是allowDelimitedEvalExpressions,這個默認值是false,所以這裡是執行不了表達式的。
所以這裡必須滿足useSpringBeanBinding這個默認值不被改變。
這裡需要注意一點,我們構造的惡意參數名稱必須以_開頭,具體原因看addDefaultMappings函數中的fieldMarkerPrefix變數。
OK,到這裡漏洞的觸發條件和流程已經很明確了,下面說說具體怎麼利用。
漏洞利用
這次漏洞測試是以Spring Webflow官方的Example中的例子來進行,因為這裡的某個flow滿足我們的條件,具體配置如下:
項目地址https://github.com/spring-projects/spring-webflow-samples/tree/master/booking-mvc,這裡在測試時需要注意修改org.springframework.webflow.samples.booking.config.WebFlowConfig.mvcViewFactoryCreator()方法中的改成 factoryCreator.setUseSpringBeanBinding(false); 因為這個工程修改了useSpringBeanBinding的默認值。
這裡直接到訂閱圖書,上圖說了在reviewBooking flow中就能出發,如下圖
點擊confirm,然後抓包添加惡意參數變數,如下圖
OK,大功告成。
參考資料
[1] :https://pivotal.io/security/cve-2017-4971
[2] :https://www.ibm.com/developerworks/cn/education/java/j-spring-webflow/index.html


※維基解密披露CIA間諜軟體「雅典娜」 可攻擊Windows XP到10
TAG:威客安全 |
※Apache Struts遠程代碼執行漏洞分析
※Microsoft Exchange Server遠程代碼執行漏洞-高危
※Cisco WebEx遠程代碼執行漏洞
※ManageEngine Applications Manager 遠程代碼執行漏洞
※ElectronJs遠程代碼執行漏洞
※Oracle WebLogic Server反序列化遠程代碼執行漏洞成焦點
※Alpine Linux APK包管理器遠程代碼執行漏洞分析
※Microsoft Office 遠程代碼執行漏洞
※Adobe Flash Player發布更新解決遠程代碼執行漏洞
※Cisco ASA防火牆webvpn遠程代碼執行
※從Linux到Windows的PowerShell遠程處理
※Windows 上的 SSH?使用 PowerShell Remoting 遠程管理 Windows 伺服器
※看我如何通過Tor Onion在Windows中執行遠程Shell
※配置SAP Solution Manager連接監控遠程Microsoft SQL Server
※MySQL mmm_agent遠程代碼注入漏洞分析
※支持HoloLens,AR遠程協同應用HoloMeeting發布
※YellowScan公司的無人機用高密度、遠程LiDAR Surveyor Ul
※Drupal遠程代碼執行漏洞分析
※Android遠程調試Web頁面
※iPhone接收Taiwan旗幟表情時奔潰——遠程IOS bug?