struts2-052漏洞學習筆記
- 瞭解漏洞
- struts2是什麼?
Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與檢視的資料互動。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合併的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,採用攔截器的機制來處理使用者的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對於WebWork,Struts 2的變化很小。
MVC:是一種思想,是一種模式,將軟體分為 Model模型、View檢視、Controller控制器
- struts2-052是什麼漏洞?
2017年9月5日,Apache Struts官方釋出最新的安全公告稱,Apache Struts 2.5.x的REST外掛存在遠端程式碼執行高危漏洞,漏洞編號為CVE-2017-9805(S2-052),受影響的版本為Struts 2.5 - Struts 2.5.12。攻擊者可以通過構造惡意XML請求在目標伺服器上遠端執行任意程式碼。漏洞的成因是由於使用XStreamHandler反序列化XStream例項的時候沒有執行嚴格的過濾導致遠端程式碼執行。
- 分析漏洞原理
在目錄/struts-2.3.33/src/plugins/rest/src/中找到問題外掛rest的原始碼
在/main/resources/struts-plugin.xml配置了很多的bean,這些bean按照content-type進行分類,並唯一指定一個具體的Handler。這些Handler都實現了ContentTypeHandler介面。從下圖原始碼中可以看出,這個ContentTypeHandler實際上是按照Content-type的不同,將請求的資料丟給指定的子類進行處理,其中紅圈為漏洞所在子類:
進入目錄/struts-2.3.33/src/plugins/rest/src/main/java/org/apache/struts2/rest/handler找到問題子類的原始碼:
這裡實際上就是對XML和java物件之間進行轉化,這裡面的 toObject方法觸發了漏洞——反序列化XStream例項的時候沒有執行嚴格的過濾。
結合以上兩個情況,如果我們攔截住提交資料的請求包,將其對應的ContentType直接改為 application/xml,則ContentTypeHandler按照Content-type,很自然的就把這個包分發給了XStreamHandler這個類來處理,然而這個類沒有進行任何校驗,直接進行了轉換,所以伺服器就會直接執行我們編寫的任意xml程式碼。
- 漏洞的重現和利用
- 搭建漏洞環境:
- 安裝apache-tomcat-7.0.82和struts-2.3.33:
直接使用wget命令在官網下載原始碼包,解壓安裝即可:
- 進入到struts 的apps(我的是/home/flurry/struts-2.3.33/apps)目錄,把struts2-rest-showcase.war檔案放到tomcat的webapps目錄(我的是/home/flurry/apache-tomcat-7.0.82/webapps):
- 進入到tomcat的bin目錄(我的是/home/flurry/apache-tomcat-7.0.82/bin),啟動tomcat:
- 設定瀏覽器網路代理(8080埠已被tomcat佔用,改用8088埠,並把不使用代理的localhost以及127.0.0.1刪掉):
- 開啟burpsuite,,設定proxy(保證與瀏覽器的設定一致):
- 點選瀏覽器介面裡的edit:
- burpsuite裡點選drop,瀏覽器進入下一介面,點選submit,burpsuite裡點選drop,抓住一個包:
- 點選action,把這個包傳送到repeater:
- 在repeater中編輯content-type值為application/xml,把最下面的請求換成寫好的payload,然後點選Go,伺服器會返回Error,如下圖所示:
Payload程式碼如下所示,其中核心部分為紅圈圈出來的部分:
<command>
<string>/usr/bin/touch</string>
<string>/tmp/test</string>
</command>
等價於命令touch /tmp/test,會在tmp目錄下建立一個叫test的檔案,檢視tmp目錄,發現有test檔案,測試成功:
使用openvas掃描:
找到該漏洞的nvt:
分析原始碼可知,首先確定系統(windows或者linux),針對不同的系統定義了command命令:ping一下本機
然後獲取主機地址,將檔案中寫好的payload寫入請求包
將請求包傳送給主機,分析得到的回覆,如果執行了命令command,則說明存在漏洞: