挖洞经验 | Openfire应用的SSRF和任意文件读取漏洞
字数 1202 2025-08-15 21:31:37

Openfire应用SSRF与任意文件读取漏洞分析

漏洞概述

Openfire是Ignite Realtime公司基于Jabber协议(XMPP)实现的开源即时通信服务,采用Java开发,适用于中小企业内部交流和即时通信。本文分析的两个漏洞分别是:

  1. SSRF漏洞 (CVE-2019-18394) - 影响FaviconServlet.java,允许未授权攻击者发起内网请求
  2. 任意文件读取漏洞 (CVE-2019-18393) - 影响PluginServlet.java,允许管理员权限用户读取任意文件

漏洞1:SSRF漏洞 (CVE-2019-18394)

受影响文件

FaviconServlet.java

漏洞原理

该漏洞存在于favicon获取功能中,关键问题代码:

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    String host = request.getParameter("host");
    host = "gmail.com".equals(host) ? "google.com" : host;
    byte[] bytes = getImage(host, defaultBytes);
    if (bytes != null) {
        writeBytesToStream(bytes, response);
    }
}

private byte[] getImage(String host, byte[] defaultImage) {
    // [...]
    byte[] bytes = getImage("http://" + host + "/favicon.ico");
    // [...]
}

漏洞分析

  1. 服务从host参数直接获取用户输入
  2. 未对输入进行任何验证或过滤
  3. 直接将用户输入拼接到URL中发起请求
  4. 攻击者可构造特殊host值访问内网资源

利用方式

攻击者可以构造如下请求访问内网资源:

GET /getFavicon?host=192.168.176.1:8080/secrets.txt? HTTP/1.1
Host: assesmenthost.com:9090

修复建议

  1. 对host参数进行严格验证,限制为合法域名
  2. 禁止包含特殊字符(如/, :, ?等)
  3. 使用白名单机制限制可访问的域名
  4. 禁用对内部IP地址的访问

漏洞2:任意文件读取漏洞 (CVE-2019-18393)

受影响文件

PluginServlet.java

漏洞原理

该漏洞存在于插件文件处理功能中,关键问题代码:

private void handleOtherRequest(String pathInfo, HttpServletResponse response) throws IOException {
    String[] parts = pathInfo.split("/");
    if (parts.length < 3) {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        return;
    }
    // [...]
    File pluginDirectory = new File(JiveGlobals.getHomeDirectory(), "plugins");
    File file = new File(pluginDirectory, parts[1] + File.separator + "web" + contextPath);
    // [...]
}

漏洞分析

  1. 服务处理/plugins/search/路径请求
  2. 使用File.separator拼接文件路径
  3. 在Windows系统上可利用\进行路径遍历
  4. 攻击者可跳出插件目录访问系统任意文件

利用条件

  1. 仅影响Windows安装版本的OpenFire服务端
  2. 需要具备管理权限账户的Cookie

利用方式

使用管理员Cookie构造如下请求:

GET /plugins/search/conf\openfire.xml HTTP/1.1
Host: assesmenthost.com:9090
Cookie: JSESSIONID=node01aaib5x4g4p781q3i2m2tm74u91.node0;

修复建议

  1. 规范化文件路径,防止路径遍历
  2. 限制文件访问范围为插件web目录
  3. 对访问的文件路径进行合法性检查
  4. 使用Path.normalize()处理路径

漏洞时间线

  • 2019.10.2 - 漏洞上报Ignite Realtime
  • 2019.10.3 - 漏洞验证有效并修复
  • 2019.11.1 - Ignite Realtime发布修复版本4.4.3
  • 2020.8.4 - 漏洞公开

通用安全建议

  1. 输入验证:对所有用户输入进行严格验证
  2. 权限控制:加强管理接口的访问控制
  3. 最小权限:服务运行使用最小必要权限
  4. 代码审计:定期进行安全代码审计
  5. 更新机制:及时应用安全更新

总结

这两个漏洞都是由于对用户输入处理不当导致的典型安全问题:

  • SSRF漏洞因未验证URL构造参数
  • 任意文件读取因未正确处理文件路径

开发人员应特别注意用户输入点的安全处理,尤其是涉及文件操作和网络请求的场景。系统管理员应限制管理接口的访问,并保持系统更新。

Openfire应用SSRF与任意文件读取漏洞分析 漏洞概述 Openfire是Ignite Realtime公司基于Jabber协议(XMPP)实现的开源即时通信服务,采用Java开发,适用于中小企业内部交流和即时通信。本文分析的两个漏洞分别是: SSRF漏洞 (CVE-2019-18394) - 影响FaviconServlet.java,允许未授权攻击者发起内网请求 任意文件读取漏洞 (CVE-2019-18393) - 影响PluginServlet.java,允许管理员权限用户读取任意文件 漏洞1:SSRF漏洞 (CVE-2019-18394) 受影响文件 FaviconServlet.java 漏洞原理 该漏洞存在于favicon获取功能中,关键问题代码: 漏洞分析 服务从 host 参数直接获取用户输入 未对输入进行任何验证或过滤 直接将用户输入拼接到URL中发起请求 攻击者可构造特殊host值访问内网资源 利用方式 攻击者可以构造如下请求访问内网资源: 修复建议 对host参数进行严格验证,限制为合法域名 禁止包含特殊字符(如 / , : , ? 等) 使用白名单机制限制可访问的域名 禁用对内部IP地址的访问 漏洞2:任意文件读取漏洞 (CVE-2019-18393) 受影响文件 PluginServlet.java 漏洞原理 该漏洞存在于插件文件处理功能中,关键问题代码: 漏洞分析 服务处理 /plugins/search/ 路径请求 使用 File.separator 拼接文件路径 在Windows系统上可利用 \ 进行路径遍历 攻击者可跳出插件目录访问系统任意文件 利用条件 仅影响Windows安装版本的OpenFire服务端 需要具备管理权限账户的Cookie 利用方式 使用管理员Cookie构造如下请求: 修复建议 规范化文件路径,防止路径遍历 限制文件访问范围为插件web目录 对访问的文件路径进行合法性检查 使用 Path.normalize() 处理路径 漏洞时间线 2019.10.2 - 漏洞上报Ignite Realtime 2019.10.3 - 漏洞验证有效并修复 2019.11.1 - Ignite Realtime发布修复版本4.4.3 2020.8.4 - 漏洞公开 通用安全建议 输入验证 :对所有用户输入进行严格验证 权限控制 :加强管理接口的访问控制 最小权限 :服务运行使用最小必要权限 代码审计 :定期进行安全代码审计 更新机制 :及时应用安全更新 总结 这两个漏洞都是由于对用户输入处理不当导致的典型安全问题: SSRF漏洞因未验证URL构造参数 任意文件读取因未正确处理文件路径 开发人员应特别注意用户输入点的安全处理,尤其是涉及文件操作和网络请求的场景。系统管理员应限制管理接口的访问,并保持系统更新。