TOMCAT常见漏洞流量分析
CVE-2017-12615
漏洞原理
配置文件中readonly=false
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
在shell的时候利用 / 绕过限制
流量特征
PUT /1.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
shell
请求方式为 PUT
URL为jsp、php等可作为webshell的文件
请求体具备 shellcode 特征
修复方案
配置readonly=true
CVE-2020-1938
漏洞原理
Apache Tomcat对于AJP协议连接器(默认监听8009端口)接收的请求过于信任,导致攻击者可以通过构造恶意请求,可实现任意文件读取以及远程代码执行
流量特征
协议为AJP
端口为AJP端口
流量中包含javax.servlet.include.path_info 或 javax.servlet.include.servlet_path 这两个字符串
修复方案
<Connector protocol="AJP/1.3"
address="127.0.0.1"
port="8009"
redirectPort="8443"
secretRequired="true"
secret="YOUR_SUPER_SECRET_AND_LONG_PASSWORD_HERE" />
CVE-2025-24813
漏洞原理
同CVE-2017-12615,需要开启上传
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
其次,Tomcat配置了基于文件的Session持久化:
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
这两种配置都使用相同的默认存储路径:$CATALINA_BASE/work/Catalina/localhost/ROOT
当发送不完全的PUT请求(使用Content-Range头)时,Tomcat会将文件路径中的分隔符(/)转换为句点(.),并将文件临时存储在会话存储目录中。
PUT /deserialize/session HTTP/1.1
Host: your-ip:8080
Content-Length: 1234
Content-Range: bytes 0-5/10
deserialize content payload
然后,发送另一个带有操作过的JSESSIONID cookie的请求,触发文件的反序列化:
GET / HTTP/1.1
Host: your-ip:8080
Cookie: JSESSIONID=.deserialize
流量特征
请求包如上
包含反序列化payload
修复方案
配置readonly=true
禁用 Tomcat 的会话持久化