漏洞分析 | Tomcat Put文件上传漏洞详解

admin 2024年4月9日22:04:20评论41 views字数 3698阅读12分19秒阅读模式
0x01 影响范围
Apache Tomcat 7.0.0 - 7.0.79
0x02 环境搭建

下载tomcat-7.0.50:

https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.50/bin/

修改conf/web.xml中的readonly初始化参数设置为false,然后启动即可:

漏洞分析 | Tomcat Put文件上传漏洞详解

0x03 漏洞复现

使用PUT方式上传文件到ROOT目录下,返回201 Created为创建成功:

漏洞分析 | Tomcat Put文件上传漏洞详解

如果返回的状态码是204代表存在一个同名文件,上传后会覆盖原来的文件:

漏洞分析 | Tomcat Put文件上传漏洞详解

漏洞分析 | Tomcat Put文件上传漏洞详解

0x04 设置远程调试

在tomcat-7.0.50中远程调试默认监听在0.0.0.0:8000上,使用./catalina.sh jpda run启动即可:

漏洞分析 | Tomcat Put文件上传漏洞详解

设置idea的远程调试即可:

漏洞分析 | Tomcat Put文件上传漏洞详解

0x05 漏洞分析

首先看tomcat的Servelt配置,ROOT目录的web.xml是存放到tomcat目录下的conf/web.xml里面,默认存在两个servlet一个是DefaultServlet另一个是JspServlet:

漏洞分析 | Tomcat Put文件上传漏洞详解

漏洞分析 | Tomcat Put文件上传漏洞详解

其中的DefaultServlet对进入到网站的的所有请求都有效,JspServlet对后缀名为jsp或者jspx的请求有效:

漏洞分析 | Tomcat Put文件上传漏洞详解

在DefaultServlet的doPut方法上下断点,然后使用burp抓包就能进入断点处,进去之后会检查配置文件中的readonly是否为真,如果为真则返回403,其调用栈如下:

doPut:510, DefaultServlet (org.apache.catalina.servlets)service:650, HttpServlet (javax.servlet.http)service:728, HttpServlet (javax.servlet.http)internalDoFilter:305, ApplicationFilterChain (org.apache.catalina.core)doFilter:210, ApplicationFilterChain (org.apache.catalina.core)doFilter:52, WsFilter (org.apache.tomcat.websocket.server)internalDoFilter:243, ApplicationFilterChain (org.apache.catalina.core)doFilter:210, ApplicationFilterChain (org.apache.catalina.core)invoke:222, StandardWrapperValve (org.apache.catalina.core)invoke:123, StandardContextValve (org.apache.catalina.core)invoke:171, StandardHostValve (org.apache.catalina.core)invoke:100, ErrorReportValve (org.apache.catalina.valves)invoke:953, AccessLogValve (org.apache.catalina.valves)invoke:118, StandardEngineValve (org.apache.catalina.core)service:409, CoyoteAdapter (org.apache.catalina.connector)process:1044, AbstractHttp11Processor (org.apache.coyote.http11)process:607, AbstractProtocol$AbstractConnectionHandler (org.apache.coyote)run:313, JIoEndpoint$SocketProcessor (org.apache.tomcat.util.net)runWorker:1149, ThreadPoolExecutor (java.util.concurrent)run:624, ThreadPoolExecutor$Worker (java.util.concurrent)run:748, Thread (java.lang)

漏洞分析 | Tomcat Put文件上传漏洞详解

Readonly的值是在servlet初始化的时候从配置文件中读取出来:

漏洞分析 | Tomcat Put文件上传漏洞详解

检查完readonly的值之后会获取请求路径,然后资源文件中查找是否存在如下方法:

org.apache.naming.resources.ProxyDirContext#lookup(java.lang.String)方法

漏洞分析 | Tomcat Put文件上传漏洞详解

首先找的是缓存资源,存在的缓存资源如下图:

漏洞分析 | Tomcat Put文件上传漏洞详解

找不到则进入

org.apache.naming.resources.ProxyDirContext#cacheLoad方法

中进行查找:

漏洞分析 | Tomcat Put文件上传漏洞详解

最终无法在cache中无法找到,接下来就会抛出没有找到的异常:

漏洞分析 | Tomcat Put文件上传漏洞详解

漏洞分析 | Tomcat Put文件上传漏洞详解

也就是将doPut中的exists置为false:

漏洞分析 | Tomcat Put文件上传漏洞详解

紧接着会获取请求:

漏洞分析 | Tomcat Put文件上传漏洞详解

获取到用户的请求之后进入

org.apache.naming.resources.Resource#Resource(java.io.InputStream)中

漏洞分析 | Tomcat Put文件上传漏洞详解

新建的newResource对象会和获取到的路径(path)进入到

org.apache.naming.resources.ProxyDirContext#bind(java.lang.String, java.lang.Object)方法中

漏洞分析 | Tomcat Put文件上传漏洞详解

经过一系列的调用之后在

org.apache.naming.resources.FileDirContext#bind

里面存在文件操作,在文件操作里面传进去的name在

java.io.File#File(java.io.File, java.lang.String)

文件名处会被去除/符号,然后进入

org.apache.naming.resources.FileDirContext#rebind

漏洞分析 | Tomcat Put文件上传漏洞详解

漏洞分析 | Tomcat Put文件上传漏洞详解

在rebind方法中完成文件的写入操作:

漏洞分析 | Tomcat Put文件上传漏洞详解

写完文件后返回去doPut中查看exists的值,这个值是一开始进行缓存检查的时候设置的,被设置为false,所以返回201的状态码:

漏洞分析 | Tomcat Put文件上传漏洞详解

根据分析来说,如果PUT请求的uri存在也会经过this.resources.rebind()方法写入文件,只不过返回的状态码是204:

漏洞分析 | Tomcat Put文件上传漏洞详解

0x06 为什么不能直接使用.jsp文件

上面的web.xml中存在存在另一个JspServlet,只要是.jsp或者.jspx后缀名的uri都会进入到

org.apache.jasper.servlet.JspServlet

进行处理,JspServlet没有doGet、doPost、doPut方法就会进入service方法中:

漏洞分析 | Tomcat Put文件上传漏洞详解

而service方法最终会进入

org.apache.jasper.servlet.JspServlet#serviceJspFile方法中

在这里面会去获取jsp文件对应的wrapper,因为没有则直接返回:

漏洞分析 | Tomcat Put文件上传漏洞详解

最终抛出404的返回状态码:

漏洞分析 | Tomcat Put文件上传漏洞详解

END

往期经典回顾

JS断点调试教学

搜索框之%的妙用

子域接管漏洞讲解

HTTP头部注入漏洞

Tomcat路径解析特性

xxl-job的命令执行详解

对某授权学校的常规渗透

契约锁命令执行漏洞分析

FindAll最强应急响应工具

一次另类的mssql渗透之路

DirtyPipe-脏管道内核提权

web站点登录框的常规突破

openfire权限绕过漏洞分析

若依4.7.6任意文件下载分析

 一次没有逗号的MSSQL注入

host碰撞之边界突破getshell

另类的SSRF漏洞的挖掘与利用

另类的XSS攻击之新型XSS载体

Nacos历史+最新漏洞详细分析

新型目录碰撞工具DirCollision

Windows文件/文件夹隐藏技巧

xray windows 1.9x版通杀补丁

FindAll史诗级最强应急响应工具

初学者的mimikatz免杀制作教程

低版本Tomcat如何另类getshell

Nginx配置不当导致内网资产暴漏

web登录框密码加密的突破小秘密

Windows快捷方式权限维持与后门

金蝶Apusic未授权目录遍历漏洞分析

Apache ActiveMQ RCE漏洞利用工具

ServerStatusDiffInterceptor反序列化

Linux本地sudo(CVE-2021-3156)提权

spring-security 三种情况下的认证绕过

密码测评相关概念及国标和行标文档分享

中华人民共和国金融行标文档分享及介绍

中华人民共和国工控国标文档分享及介绍

xxl-job前台api未授权Hessian2反序列化

fastjson反序列化漏洞初探之parseObject

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!!

点赞是鼓励 在看是认同 分享传递知识

看完点个“在看”漏洞分析 | Tomcat Put文件上传漏洞详解分享给更多人漏洞分析 | Tomcat Put文件上传漏洞详解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月9日22:04:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞分析 | Tomcat Put文件上传漏洞详解https://cn-sec.com/archives/2641188.html

发表评论

匿名网友 填写信息