Apache Tomcat AJP协议文件读取与包含漏洞
Apache Tomcat作为广泛使用的开源Java Web应用服务器,其AJP(Apache JServ Protocol)协议在反向代理场景中扮演着重要角色,AJP协议的设计缺陷曾导致严重的文件读取与包含漏洞(CVE-2020-1938、CVE-2020-35489等),攻击者可利用该漏洞读取服务器敏感文件甚至执行任意代码,本文将从漏洞原理、影响范围、复现方式及防御措施等方面展开分析。
AJP协议与漏洞背景
AJP协议是Tomcat与Web服务器(如Apache HTTP Server、Nginx)之间的高性能通信协议,基于二进制格式设计,支持长连接和请求复用,常用于负载均衡和静态资源分离场景,协议通过ajp13
实现,允许Web服务器将HTTP请求转发至Tomcat处理。
漏洞的核心问题在于AJP协议对请求参数的校验不足,当Tomcat开启了AJP连接器(默认端口8009)且未正确配置secret
属性时,攻击者可通过构造特殊的AJP请求,绕过Tomcat的访问控制,读取Web应用目录外的敏感文件(如WEB-INF
配置文件、系统配置等),或在特定条件下实现远程代码执行。
漏洞原理与利用方式
文件读取漏洞(CVE-2020-1938)
漏洞触发条件:
- Tomcat版本:9.0.x < 9.0.31,8.5.x < 8.5.51,7.0.x < 7.0.100。
- AJP连接器已启用且未配置
secret
。 - 支持AJP协议的反向代理(如mod_jk、mod_proxy_ajp)将流量转发至Tomcat。
利用原理:
攻击者通过AJP协议发送包含javax.servlet.include.request_uri
等恶意头部的请求,Tomcat在处理时会将请求参数与内部路径拼接,导致目录穿越,构造请求:GET /xxx HTTP/1.1 Host: target Accept: */* X-Forwarded-For: 127.0.0.1 Referer: http://xxx Proxy-Connection: Keep-Alive Content-Type: application/x-www-form-urlencoded X-Forwarded-Host: 127.0.0.1 X-Forwarded-Server: 127.0.0.1 Content-Length: 0
结合工具(如
ysoserial
)或直接请求/index.jsp
,可读取WEB-INF/web.xml
、/etc/passwd
等文件。
远程代码执行漏洞(CVE-2020-35489)
触发条件:
- Tomcat版本:9.0.x < 9.0.36,8.5.x < 8.5.63,7.0.x < 7.0.93。
- 存在可上传恶意文件(如JSP)的Web应用。
利用链:
攻击者先通过文件读取漏洞获取Session
或Context
信息,再结合包含漏洞(如include
指令)加载恶意JSP文件,最终导致代码执行。<%@ include file="file:///etc/passwd" %>
若服务器存在文件上传功能,可上传Webshell并通过AJP协议触发执行。
漏洞影响范围
影响范围 | 具体场景 |
---|---|
敏感信息泄露 | 读取WEB-INF/web.xml (数据库配置)、/etc/passwd (系统用户)、.ssh 目录等。 |
服务器权限获取 | 结合漏洞读取配置文件,进一步获取系统权限或横向移动。 |
业务中断 | 攻击者可篡改页面或植入恶意代码,导致服务不可用或用户数据泄露。 |
漏洞复现步骤(以文件读取为例)
环境准备:
- 部署受影响版本的Tomcat(如9.0.30),启用AJP连接器(
server.xml
中配置<Connector port="8009" protocol="AJP/1.3" />
)。 - 使用
mod_proxy_ajp
将Apache请求转发至Tomcat。
- 部署受影响版本的Tomcat(如9.0.30),启用AJP连接器(
工具利用:
使用ysoserial
或Ceye
平台构造Payload,通过curl
发送AJP请求:curl -H "X-Forwarded-Host: 127.0.0.1" -H "X-Forwarded-For: 127.0.0.1" "http://target:8009/"
观察响应中是否包含
/etc/passwd
内容。验证结果:
若返回文件内容,则漏洞存在;若返回404或权限错误,则可能未受影响。
防御与修复措施
官方补丁升级
- Tomcat版本升级:
- 0.x升级至9.0.31+,8.5.x升级至8.5.51+,7.0.x升级至7.0.100+。
- 下载地址:Apache Tomcat官网。
配置加固
- 禁用AJP连接器:若无需AJP协议,在
server.xml
中注释或删除AJP Connector配置。<!-- <Connector port="8009" protocol="AJP/1.3" /> -->
- 启用
secret
属性:若必须使用AJP,配置secret
参数(需与Web服务器一致):<Connector port="8009" protocol="AJP/1.3" secret="yourSecretKey" />
网络与访问控制
- 防火墙限制:仅允许可信IP访问AJP端口(8009)。
- 反向代理配置:在Web服务器层(如Nginx)禁用不必要的AJP转发,或使用
mod_security
过滤恶意请求。
安全审计与监控
- 定期扫描:使用
Nuclei
、AWVS
等工具检测AJP端口是否存在漏洞。 - 日志分析:监控Tomcat访问日志,关注异常路径(如
/WEB-INF/
、/etc/
)。
Apache Tomcat AJP协议漏洞的本质是协议层面对路径遍历和文件包含的校验缺失,随着Tomcat官方版本的迭代,高危漏洞已逐步修复,但未升级或配置不当的系统仍面临风险,建议用户及时更新版本,严格限制AJP协议的访问范围,并结合网络层防护措施,构建多层次安全体系,对于企业级应用,还需定期开展渗透测试和代码审计,从源头避免类似漏洞的引入。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/16465.html