漏洞復現
繼 3 月 7 日爆發的 S2-045 遠程命令執行漏洞風波之后,今日 Struts2 官方發布另一個高危漏洞 S2-046,CVE 編號依然是 CVE-2017-5638,據官方披露,最新的漏洞與 S2-045 類似,只是攻擊字段發生變化。修復方案依然與 S2-045 相同,升級至 2.3.32 或者 2.5.10.1 版本即可防御針對這兩個漏洞攻擊。
S2-046
Struts2 是一個基于 MVC 設計模式的 Web 應用框架,它本質上相當于一個 servlet,在 MVC 設計模式中,Struts2 作為控制器 (Controller) 來建立模型與視圖的數據交互。Struts2 的使用范圍及其廣泛,國內外均有大量廠商使用該框架。
漏洞描述:
據漏洞提交者紕漏,S2-046 的利用條件有以下三個方面:
1、系統必須使用 Jakarta 插件,檢查 Struts2 配置文件中是否有以下配置:<constant name =“struts.multipart.parser”value =“jakarta-stream”/>
2、上傳文件的大小(由 Content-LSength 頭指定)大于 Struts2 允許的最大大小(2GB)
3、文件名內容構造惡意的 OGNL 內容。
如果滿足以上要求,Struts2 受影響版本將創建一個包含攻擊者控制的異常文件名,使用 OGNL 值堆棧來定位錯誤消息,OGNL 值堆棧將插入任何 OGNL 變量($ {}或%{})作為 OGNL 表達式,然后實現任意代碼執行。
目前網絡上已披露出針對 S2-046 的 POC
漏洞復現:
我們在本地搭建環境進行測試:
查看 Struts2 的配置文件,發現存在
<constant name =“struts.multipart.parser”value =“jakarta-stream”/>
Struts2 的配置文件
下面進行網站上傳測試,構造數據包如下,設定 Content-LSength 值大于 2GB,并構造惡意文件名,如下圖所示:
構造數據包
通過響應數據包可看到惡意代碼成功執行,攻擊成功,如下圖所示:
代碼成功執行
友情提示:
1.請升級到 Apache Struts 2.3.32 或 2.5.10.1 版本,下載地址:
http://archive.apache.org/dist/struts/2.3.32/
http://archive.apache.org/dist/struts/2.5.10.1/
2.測試的時候設定 Content-LSength 值不大于 2GB也可以利用成功,原因未知。