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错误日志
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)
在conf/web.xml
文件里,添加必要参数readonly
,并设置为false
这样,像其参数格式一样,添加到<servlet>
标签里
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
2
3
4
因为tomcat默认8080端口,burpsuite默认端口也是8080,冲突了抓不到包器,所以将tomcat的8080端口改为8081
在conf/server.xml
文件里,修改端口8080为8081
在bin
目录下,双击startup.bat
启动tomcat
# 3.2 漏洞复现
打开burpsuite自带浏览器,关闭拦截,访问127.0.0.1:8081
,可以看到tomcat的默认首页,开启拦截,刷新页面
把这个GET请求右键,发送到repeater
,手动修改请求方法为PUT
,并在访问路由后面添加一个文件名参数1.txt
,文件内容随意,测试一下
响应包里有201 Created
,表示上传成功
正常访问127.0.1:8081/1.txt
,可以看到文件内容
# 3.3 上传jsp文件
在repeater
里,接着使用PUT
请求,把1.txt
内容换成jsp代码,也可以正常上传,返回204 No Content
,也表示成功上传
<%out.println("HelloWorld");%>
把文件名换成1.jsp
,接着上传,进行测试,上传失败,返回了404 Not Found
,说明tomcat在put
直接请求jsp时,访问了这个文件,不存在,并不会写文件
/1.jsp/
绕过
在文件名后面添加/
,当作目录处理,可以绕过tomcat的检测,落地还是jsp文件,jsp代码可以正常解析
提示
下面是一些windows平台文件上传特性,php、jsp等都适用
windows特性:文件扩展名空格绕过
在文件名后添加%20
,windows系统不允许扩展名后有空格,会自动去除
windows特性:显示指定流绕过
看一下微软官方文档流的命名约定 (opens new window)
文件名后添加::$DATA
,表示指定流,
windows特性:文件名大小写不敏感绕过
windows系统文件名大小写不敏感,可以绕过tomcat的检测
上传是上传成功了,但是不解析大写的JSP
windows特性:自动去除末尾多出的点
在文件名后添加.
,windows系统会自动去除多余的点
# 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
进入vulhub
目录,找到tomcat/put
目录,执行docker-compose命令
cd vulhub/tomcat/CVE-2017-12615
docker compose up -d
2
访问http://192.168.0.107:8080
,可以看到tomcat的默认首页
# 4.2 漏洞复现
进入靶机shell环境,找到配置文件,vulhub
开发者已经配置好了漏洞环境
同样是抓取一个GET
请求,发送到repeater
,修改请求方法为PUT
,文件名1.txt
,文件内容随意
返回201
,上传成功,访问1.txt,可以看到文件内容
对应这个漏洞,在linux环境下,没有那么多绕过姿势,只能jsp
文件名后添加/
作为目录,绕过tomcat的检测,落地成jsp文件
关闭docker容器
docker compose down