Web
当使用tomcat时,如果使用了tomcat提供的session持久化功能,如果存在文件上传功能,且服务端存在可利用的gadget,那么恶意请求者将可能发起一个恶意请求造成服务端远程命令执行。
漏洞受影响的tomcat版本:
<= 9.0.34
<= 8.5.54
<= 7.0.103
触发条件
该漏洞的触发条件并不是默认配置,较为苛刻:
-
服务器PersistenceManager配置中使用了FileStore
-
tomcat/lib或者WEB-INF/lib等目录下的依赖存在可用的gadget
-
存在文件上传功能(传到任意目录都可以,需要知道上传后的目录路径以及文件后缀必须为.session)
漏洞复现
以Tomcat 8.5.50为例,首先在/conf/context.xml里配置Manager节点,代码如下
1 | <Manager className="org.apache.catalina.session.PersistentManager"> |
在Tomcat加载的class里需要有反序列化的gadget,这里以commons-collections4-4.0.jar为例,并将其放在webapps\ROOT\WEB-INF\lib\目录下。
使用ysoserial工具生成反序列化的payload:
1 | java -jar ysoserial-master-30099844c6-1.jar CommonsCollections2 "calc" > payload.session |
将生成的payload.session置于D:\Pentest\目录下,在实际攻击中可以利用上传漏洞来进行。
在tomcat的webapps\ROOT目录下放置sess.jsp,模拟简单的session操作。
1 | <%@ page contentType="text/html; charset=UTF-8" %> |
访问该文件路径,Burp抓包并修改Cookie里的JSESSIONID,成功在服务端触发反序列化,弹出计算器。
源码调试
该漏洞的触发原因在于tomcat的org.apache.catalina.session.FileStore,在这里进行了反序列化,且没有过滤输入流,而且代码中使用了getAbsolutePath()获取文件路径,导致可以使用…/进行跨目录,结合可用gadget从而导致反序列化命令执行漏洞。
使用tomcat源码来调试该漏洞。
在org.apache.catalina.session.FileStore文件的load(String id)处打断点
触发上面的请求
往下跟,可以看到这里使用了getAbsolutePath()来获取文件路径,存在跨目录漏洞。
跟到readObjectData
F7跟进
继续跟,可以看到creationTime这些值都是通过readObject函数进行反序列化。
继续走,即可触发反序列化命令执行。