目录

Tomcat put上传漏洞 CVE-2017-12615 复现

# 1. 漏洞描述

  • 漏洞编号:CVE-2017-12615
  • 影响版本范围:Apache Tomcat 7.0.0 - 7.0.79(?)
  • 影响平台:Windows、linux
  • 漏洞类型:不安全的配置、任意文件上传、RCE

# 2. 漏洞原理

Tomcat默认配置中,conf/web.xml文件里没有配置对应PUT请求的处理,所以默认情况下,Tomcat是不处理PUT请求的。如果在web.xml文件里自行添加了readonly参数的false值,就添加了PUT请求的处理

该参数默认为true,只读状态:不允许用户put方法写入文件

开启后,put请求类似一个上传接口,把文件储存在默认的网站根目录webapps/ROOT下,并且文件名和文件内容都可控

总结:不安全的参数配置导致的文件上传漏洞,在上传jsp后,可以RCE,getshell

补充

tomcat对文件扩展名有一定检测,不能直接上传jsp文件,可以通过一些姿势绕过

# 3. windows环境漏洞复现

看了一些其他师傅博客,很多都指出只会影响windows平台,两个都试试了

# 3.0 补充

复现过程一些tomcat目录的作用

- bin
    - startup.bat  # 启动tomcat
    - shutdown.bat  # 关闭tomcat
- conf
    - web.xml  # tomcat参数配置文件
    - server.xml  # tomcat服务器配置文件
- webapps
    - ROOT  # 网站根目录
        - index.html  # 默认首页
        - WEB-INF  # 
            - web.xml  # 网站参数配置文件
- logs  # tomcat日志目录
    - localhost_access_log.2025-05-13.txt  # tomcat访问日志
    - localhost.2025-05-13.log  # tomcat错误日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14

PUT 方法的原意是:“把某个资源上传到服务端的指定 URI 处,如果不存在就创建,如果存在就替换”

# 3.1 环境搭建

漏洞环境:

  • windows10
  • tomcat 7.0.79
  • jdk 1.8
  • burpsuite

下载windows x64 tomcat 7.0.79,解压。下载链接apache-tomcat-7.0.79-windows-x64.zip (opens new window)

1

2

conf/web.xml文件里,添加必要参数readonly,并设置为false

这样,像其参数格式一样,添加到<servlet>标签里

<init-param>
    <param-name>readonly</param-name>
    <param-value>false</param-value>
</init-param>
1
2
3
4

3

因为tomcat默认8080端口,burpsuite默认端口也是8080,冲突了抓不到包器,所以将tomcat的8080端口改为8081

conf/server.xml文件里,修改端口8080为8081

4

bin目录下,双击startup.bat启动tomcat

5

# 3.2 漏洞复现

打开burpsuite自带浏览器,关闭拦截,访问127.0.0.1:8081,可以看到tomcat的默认首页,开启拦截,刷新页面

6

把这个GET请求右键,发送到repeater,手动修改请求方法为PUT,并在访问路由后面添加一个文件名参数1.txt,文件内容随意,测试一下

响应包里有201 Created,表示上传成功

7

正常访问127.0.1:8081/1.txt,可以看到文件内容

8

# 3.3 上传jsp文件

repeater里,接着使用PUT请求,把1.txt内容换成jsp代码,也可以正常上传,返回204 No Content,也表示成功上传

<%out.println("HelloWorld");%>
1

9

把文件名换成1.jsp,接着上传,进行测试,上传失败,返回了404 Not Found,说明tomcat在put直接请求jsp时,访问了这个文件,不存在,并不会写文件

10

/1.jsp/绕过

在文件名后面添加/,当作目录处理,可以绕过tomcat的检测,落地还是jsp文件,jsp代码可以正常解析

11

提示

下面是一些windows平台文件上传特性,php、jsp等都适用

windows特性:文件扩展名空格绕过

在文件名后添加%20,windows系统不允许扩展名后有空格,会自动去除

12

windows特性:显示指定流绕过

看一下微软官方文档流的命名约定 (opens new window)

13

文件名后添加::$DATA,表示指定流,

14

windows特性:文件名大小写不敏感绕过

windows系统文件名大小写不敏感,可以绕过tomcat的检测

15

上传是上传成功了,但是不解析大写的JSP

windows特性:自动去除末尾多出的点

在文件名后添加.,windows系统会自动去除多余的点

16

# 4. linux环境漏洞复现

# 4.1 环境搭建

前置环境:

  • docker
  • docker-compose
  • git

漏洞环境:

  • linux(docker)
  • tomcat 8.5.19
  • jdk 1.8

使用vulhub提供的docker环境复现

前提,已经安装了git、docker和docker-compose

git克隆vulhub的整个项目

git clone --depth 1 https://github.com/vulhub/vulhub
1

17

进入vulhub目录,找到tomcat/put目录,执行docker-compose命令

cd vulhub/tomcat/CVE-2017-12615
docker compose up -d
1
2

18

访问http://192.168.0.107:8080,可以看到tomcat的默认首页

19

# 4.2 漏洞复现

进入靶机shell环境,找到配置文件,vulhub开发者已经配置好了漏洞环境

22

同样是抓取一个GET请求,发送到repeater,修改请求方法为PUT,文件名1.txt,文件内容随意

20

返回201,上传成功,访问1.txt,可以看到文件内容

对应这个漏洞,在linux环境下,没有那么多绕过姿势,只能jsp文件名后添加/作为目录,绕过tomcat的检测,落地成jsp文件

21

关闭docker容器

docker compose down
1

23

最后一次更新于: 2025/05/13, 19:03:43