环境与调试
(1) Tomcat各版本下载:https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/
(2) IDEA远程JVM调试:
1 | 首先在 /conf 目录下新建 setenv.sh文件 |
Tomcat PUT RCE
CVE-2017-12615
参考:https://paper.seebug.org/399/
本质是利用构造特殊后缀名绕过JSPServlet
的检测,执行DefaultServlet
中的doPut
逻辑,上传恶意jsp
文件。
Tomcat Session反序列化
CVE-2020-9484
1 | 影响版本: |
首先在/conf/context.xml
中开启会话管理器
1 | <Manager className="org.apache.catalina.session.PersistentManager"> |
PersistentManager
是 Tomcat 中的一种会话管理器,它允许 会话数据 在 Tomcat 重启或服务器停机时得以 持久化存储。默认情况下,Tomcat 的会话数据存储在内存中,但如果启用了 PersistentManager,会话数据会被写入到文件系统中,从而在 Tomcat 重启后保持会话状态。
className="org.apache.catalina.session.PersistentManager
指定了使用PersistentManager
来管理会话。
FileStore
是 PersistentManager
用来将会话数据存储到磁盘上的类。它将会话对象序列化为文件,存储在指定的目录中,支持跨服务器重启保持会话状态。
directory="/Users/gehansheng/Desktop/Java代码审计/Tomcat历史漏洞分析/apache-tomcat-10.0.0-M4/sessionFile"
为指定存储会话数据的目录文件。
既然FileStore
会将会话数据序列化为文件,那么就会存在反序列化漏洞的风险,这个漏洞就是由此产生的。
使用CC链验证漏洞,先在/webapps/ROOT/WEB_INF/lib
下添加commons-collections-3.2.1.jar
包的依赖,然后使用ysoserial
生成含有恶意序列化内容的payload.session
文件
1 | java -jar ysoserial-all.jar CommonsCollections1 "open -a Calculator" > /Users/gehansheng/Desktop/Java代码审计/Tomcat历史 漏洞分析/apache-tomcat-10.0.0-M4/sessionFile/poc.session |
验证 - 命令执行
反序列化.session
序列化文件的函数为org.apache.catalina.session.FileStore#load
调用逻辑大致如下
1 | org.apache.catalina.session.FileStore#load |
总结来看,这个漏洞的利用条件很高
1 | (1) 文件上传路径与文件内容攻击者可控 |
Tomcat 文件上传 + session反序列化
CVE-2025-24813
1 | 影响版本: |
利用条件是 CVE-2017-12615 和 CVE-2020-9484 的汇总
1 | 同时开启PUT和会话存储机制 |
漏洞流程大约如下
1 | 当 PUT /1.txt时 -> /webapps/ROOT/1.txt |
PUT /xxxxxx/session -> /work/Catalina/localhost/ROOT/.xxxxxx.session
的逻辑发生在org.apache.catalina.servlets.DefaultServlet#executePartialPut
中
走到if
中的前提条件是range
不为空,跟进org.apache.catalina.servlets.DefaultServlet#parseContentRange
,发现其为Content-Range
请求头
构造请求头即可
那么只需要PUT
恶意序列化字节码,就可以出发反序列化RCE了。
1 | (1) 使用ysoserial生成CC1链到payload.txt |