1. 程式人生 > >Struts2-057/CVE-2018-11776兩個版本RCE漏洞分析(含EXP)

Struts2-057/CVE-2018-11776兩個版本RCE漏洞分析(含EXP)

0x01 前言

2018年8月22日,Apache Strust2釋出最新安全公告,Apache Struts2存在遠端程式碼執行的高危漏洞(S2-057/CVE-2018-11776),該漏洞由Semmle Security Research team的安全研究員Man YueMo發現。該漏洞是由於在Struts2開發框架中使用namespace功能定義XML配置時,namespace值未被設定且在上層動作配置(Action Configuration)中未設定或用萬用字元namespace,可能導致遠端程式碼執行。同理,url標籤未設定value和action值且上層動作未設定或用萬用字元namespace時也可能導致遠端程式碼執行,經過筆者自建環境成功復現漏洞且可以執行命令回顯,文末有你們想要的 !

 

0x02 漏洞利用

筆者搭的環境分別是Strust2 2.3.20 版本和 Strust2 2.3.34版本,漏洞利用大致分為三種方式:數值計算、彈出計算器、 命令回顯。

 

2.1、數值計算

數值計算相對最簡單,在URL上指定 %{100+200} 就可以發生跳轉,得到計算的結果

 

2.2、彈出計算器

2.3.20 版本的POC如下:

2.3.34 版本參考的POC如下:

2.3、命令回顯

兩個版本都是利用com.opensymphony.xwork2.dispatcher.HttpServletResponse物件去列印命令執行後的回顯資料

2.3.20 版本的POC如下:

攻擊後效果如下圖

0X03 漏洞分析

在分析漏洞之前,需要配置struts.xml檔案,這個檔案就是struts2的核心配置檔案,大多數的時候增減配置都需要操控這裡;

總共兩處需要注意,第一處一定要配置struts.mapper.alwaysSelectFullNamespace  = true ,否則不能觸發漏洞,這個配置的目的是設定是否一直在最後一個斜線之前的任何位置選定NameSpace;第二處result標籤返回的型別選擇 “ redirectAction 或 chain“ , 只有這兩個配置選項的值是可以將action轉發或者重定向;關於type具體可以參考下圖

說完了配置,開始動態分析。漏洞位於 struts2-core.jar!/org/apache/struts2/dispatcher/ServletActionRedirectResult.class

This.namespace這個成員的值來自於getNamespace()方法,再通過getUriFromActionMapping()返回URI字串;

通過getUriFromActionMapping獲取的值賦給了tmpLocation變數,接著表示式進入setLocation方法

再通過super.execute方法呼叫了ServletActionResult , 而在execute方法體內跟進了conditionalParse方法,在這個方法內呼叫了ONGL執行的關鍵方法translateVariables。

獲得的param值傳入到translateVariables()方法內,最終在OnglTextPaser裡導致了OGNL表示式執行。

再彈出計算器後獲得lastFinalLocation的值為當前執行後的控制代碼,這個值作為響應跳轉的action地址 ,也就是在瀏覽器中彈出計算器後在位址列中出現的URI

到這裡彈出計算器的分析到此為止,接下來看下基於命令執行回顯結果的分析,基本上流程和上述一樣,唯一不同之處lastFinalLocation返回的值是NULL,這也就引發出提交後沒有做302的跳轉,依舊是當前的action,並且返回的值是200

知道了原理後小同事用python實現了自動化利用工具,此工具用途僅供學習研究;

 

0x04 防禦措施

將框架版本升級到官方最新版本;對於Web應用來說,儘量保證程式碼的安全性;對於IDS規則層面來說,數值計算和彈計算器返回的狀態碼都是302,並且Location跳轉欄位含有特徵控制代碼字串;如果是命令回顯返回的200狀態碼,且有命令結果輸出;

 

0x05 小結

文章中提及的python EXP下載地址: https://github.com/Ivan1ee

 

0x06 參考連結

https://cwiki.apache.org/confluence/display/WW/S2-057

https://lgtm.com/blog/apache_struts_CVE-2018-11776

https://blog.csdn.net/madison__/article/details/55671426