作者:啟明星辰ADLab

漏洞描述

2017年9月5日,Apache Struts發布最新安全公告,Apache Struts2的REST插件存在遠程代碼執行的高危漏洞,該漏洞由lgtm.com的安全研究員匯報,漏洞編號為CVE-2017-9805(S2-052)。Struts2 REST插件的XStream組件存在反序列化漏洞,使用XStream組件對XML格式的數據包進行反序列化操作時,未對數據內容進行有效驗證,存在安全隱患,可被遠程攻擊。

相關鏈接如下:

https://cwiki.apache.org/confluence/display/WW/S2-052 https://lgtm.com/blog/apache_struts_CVE-2017-9805

補丁分析

在Struts2官方github上下載最新代碼,發現 org.apache.struts2.rest.handler 這個包下多了幾個類文件,分別為AbstractContentTypeHandler、AllowedClasses、AllowedClassNames、XStreamPermissionProvider ,如下圖所示:

XStreamHandler類修改了createXStream方法,同時增加了幾個方法,作用是拒絕不安全的類執行。如下圖所示:

由補丁可以發現REST插件將XStream處理的數據進行了處理,在調用 “xstream.fromXML(in, target);” 反序列化之前對其進行了檢查。

漏洞分析

根據補丁分析, 構造相對應的漏洞檢測數據包。使用調試工具分析,發現Action經過REST插件處理時會被ContentTypeInterceptor這個類攔截,進入intercept方法如下圖所示:

這個Intercept攔截方法很重要,分三步:

第一步:getHandlerForRequest方法會判斷提交的請求類型,如果是XML的話就交給XStreamHandler調用toObject方法

第二步:如果瀏覽器提交的數據包長度大于0的話就獲取其輸入流,然后將數據包生成一個InputStreamReader對象也就是reader

第三步:調用XStreamHandler的toObject方法將reader數據流進行xml反序列化。

如下圖所示:

結合之前對補丁的分析,這里XStream并沒有對reader的內容進行驗證,導致反序列化漏洞。

漏洞復現

Struts2 REST插件的XStream組件存在反序列化漏洞,使用XStream組件對XML格式的數據包進行反序列化操作時,未對數據內容進行有效驗證,可直接在數據包中插入惡意代碼,導致服務器被攻陷。漏洞復現如下圖所示:

可以看到服務器回顯錯誤,但是已經成功執行了系統命令。證明漏洞存在,并且通過遠程即可實現攻擊。

受影響的版本

Apache Struts Version:Struts 2.5 - Struts 2.5.12

規避方案

  • 升級Struts到2.5.13最新版本。

  • 在不使用時刪除Struts REST插件,或僅限于服務器普通頁面和JSONs <constant name="struts.action.extension"?value="xhtml,,json"?/>

  • 部署啟明星辰web應用防火墻 http://www.venustech.com.cn/SafeProductInfo/413/39.Html


啟明星辰積極防御實驗室(ADLab)

ADLab成立于1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員。截止目前,ADLab通過CVE發布Windows、Linux、Unix等操作系統安全或軟件漏洞近300個,持續保持亞洲領先并確立了其在國際網絡安全領域的核心地位。實驗室研究方向涵蓋操作系統與應用系統安全研究、移動智能終端安全研究、物聯網智能設備安全研究、Web安全研究、工控系統安全研究、云安全研究。研究成果應用于產品核心技術研究、國家重點科技項目攻關、專業安全服務等。


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