1. 條件
1)攻擊者可以控制服務器上的文件名/文件內容
2)tomcat context配置了persistencemanager的fileSotre
3) persistenceManager 配置了sessionAttributeValueClassNameFilter的值為NULL或者寬松過濾
4) 攻擊者知道fileSotre存放位置
條件非常苛刻, 需要同時滿足該4個條件。
2. 漏洞原理
利用tomcat創建的session,反序列后進行惡性攻擊。 一般而言,session存在於服務器內存中,當服務器重啟或者重新加載時,內存中的session就會全部丟失。為了避免這種情況,在某一些場合下,服務器的session可以存放在文件系統中或者數據庫中,該過程稱之為session持久化,session持久化是將session以序列化的形式存放的,因此存放session需要實現java的序列號接口(java.io.serialize).
具體創建過程如下:
發起session請求》tomcat servelet容器創建httpsession對象》容器將httpsession對象從內存中移到文件系統中或者數據庫中》再次需要訪問請求時直接從文件系統或者數據庫中加載session至內存。
session保存到文件系統具體配置,context.xml
即,通過persistenceManger持久化,將文件存放在文件系統,位置為…/session
反序列過程:tomcat的FileSore 加文件直接反序列化獲取session
用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
3. 影響版本
Apache Tomcat 10.x < 10.0.0-M5
Apache Tomcat 9.x < 9.0.35
Apache Tomcat 8.x < 8.5.55
Apache Tomcat 7.x < 7.0.104
4. 修復方法
1. 升級版本,
2. 開啟禁用session
取消注釋