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_infojavax.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 的会话持久化

一个仍在爬山的人