挖洞经验 | Openfire应用的SSRF和任意文件读取漏洞
字数 1202 2025-08-15 21:31:37
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获取功能中,关键问题代码:
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");
// [...]
}
漏洞分析
- 服务从
host参数直接获取用户输入 - 未对输入进行任何验证或过滤
- 直接将用户输入拼接到URL中发起请求
- 攻击者可构造特殊host值访问内网资源
利用方式
攻击者可以构造如下请求访问内网资源:
GET /getFavicon?host=192.168.176.1:8080/secrets.txt? HTTP/1.1
Host: assesmenthost.com:9090
修复建议
- 对host参数进行严格验证,限制为合法域名
- 禁止包含特殊字符(如
/,:,?等) - 使用白名单机制限制可访问的域名
- 禁用对内部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);
// [...]
}
漏洞分析
- 服务处理
/plugins/search/路径请求 - 使用
File.separator拼接文件路径 - 在Windows系统上可利用
\进行路径遍历 - 攻击者可跳出插件目录访问系统任意文件
利用条件
- 仅影响Windows安装版本的OpenFire服务端
- 需要具备管理权限账户的Cookie
利用方式
使用管理员Cookie构造如下请求:
GET /plugins/search/conf\openfire.xml HTTP/1.1
Host: assesmenthost.com:9090
Cookie: JSESSIONID=node01aaib5x4g4p781q3i2m2tm74u91.node0;
修复建议
- 规范化文件路径,防止路径遍历
- 限制文件访问范围为插件web目录
- 对访问的文件路径进行合法性检查
- 使用
Path.normalize()处理路径
漏洞时间线
- 2019.10.2 - 漏洞上报Ignite Realtime
- 2019.10.3 - 漏洞验证有效并修复
- 2019.11.1 - Ignite Realtime发布修复版本4.4.3
- 2020.8.4 - 漏洞公开
通用安全建议
- 输入验证:对所有用户输入进行严格验证
- 权限控制:加强管理接口的访问控制
- 最小权限:服务运行使用最小必要权限
- 代码审计:定期进行安全代码审计
- 更新机制:及时应用安全更新
总结
这两个漏洞都是由于对用户输入处理不当导致的典型安全问题:
- SSRF漏洞因未验证URL构造参数
- 任意文件读取因未正确处理文件路径
开发人员应特别注意用户输入点的安全处理,尤其是涉及文件操作和网络请求的场景。系统管理员应限制管理接口的访问,并保持系统更新。