Skip to content

fix: [安全漏洞] 修复越权访问与SSRF两个高危漏洞(附完整POC及复现过程)#9673

Open
Rangsh wants to merge 2 commits into
jeecgboot:mainfrom
Rangsh:main
Open

fix: [安全漏洞] 修复越权访问与SSRF两个高危漏洞(附完整POC及复现过程)#9673
Rangsh wants to merge 2 commits into
jeecgboot:mainfrom
Rangsh:main

Conversation

@Rangsh

@Rangsh Rangsh commented Jun 1, 2026

Copy link
Copy Markdown

漏洞一:越权访问防护遗漏

【问题描述】
SystemApiController 中,针对单个用户的查询接口(如 getUserByName)已正确调用 SensitiveInfoUtil.handlerObject 进行了脱敏处理。但批量查询接口(queryUsersByUsernamesqueryUsersByIds)直接返回了底层的 List<JSONObject>,遗漏了脱敏步骤。
这导致低权限用户可以利用批量查询接口,越权获取其他用户(含管理员)的手机号、邮箱等敏感信息明文,存在水平/垂直越权访问和敏感信息泄露漏洞

【修复方案】

  • 遍历返回的 JSONObject,将其转换为 LoginUser 实体。
  • 统一调用 SensitiveInfoUtil.handlerObject 执行脱敏规则。
  • 采用 Fastjson 将脱敏后的实体回填至 JSONObject 中,确保对外输出数据安全且不影响原有业务逻辑。

复现步骤

  1. 登录系统,获取一个低权限测试账号(例如 ceshi)的 X-Access-Token
  2. 在浏览器控制台(F12 -> Console)或使用 Postman,携带该低权限 Token 请求目标接口。
  3. 接口成功返回管理员(如 admin)用户的详细信息,且 phoneemail 字段均为未脱敏的明文。

漏洞复现 POC (JavaScript)

// 使用低权限用户的 Token
var token = ""; 

// 替换为实际的后端地址
var url = 'http://localhost:8080/jeecg-boot/sys/api/queryUsersByUsernames?usernames=admin'; 

fetch(url, { 
  method: 'GET', 
  headers: { 
    'X-Access-Token': token 
  } 
}) 
.then(response => response.text()) 
.then(text => { 
    try { 
        let data = JSON.parse(text); 
        console.log("【漏洞复现】返回的用户信息如下:", data); 
    } catch (e) { 
        console.error("请求失败,服务器返回的不是JSON,而是:", text.substring(0, 100) + "..."); 
    } 
}); 

效果对比

修改前 (Before):

越权访问批量接口时,phoneemail 等字段为明文。

834e90582b375a82c3a2a7dcbd3f631

修改后 (After):

越权访问批量接口时,敏感字段已按系统策略正确脱敏(如星号隐藏或加密)。

ce8dcf89171d693335cc9c3a40a8447

测试情况

  • 验证低权限用户调用 queryUsersByUsernames 接口,敏感字段已脱敏。
  • 验证低权限用户调用 queryUsersByIds 接口,敏感字段已脱敏。
  • 确认修改未影响原有 JSON 中非实体字段的正常返回。

漏洞二:SSRF 防护遗漏

【问题描述】
AIChatHandler.getFirstImageBase64() 方法中,处理用户传入的参考图片 URL 时,未调用项目内置的安全过滤工具 SsrfFileTypeFilter.checkSsrfHttpUrl(),导致攻击者可以传入任意内网 IP 及端口。
结合 AiragChatController 中的 /airag/chat/send 接口使用了 @IgnoreAuth 注解允许匿名访问,攻击者无需任何权限,即可利用“图生图”功能向服务器发送包含内网地址的恶意 payload。这会导致服务器变成攻击者的跳板,存在严重的内网资产探测(Blind SSRF)和内网未授权服务攻击风险。

【修复方案】

  • AIChatHandler.getFirstImageBase64() 处理网络图片分支(即 matcher.matches()true 时),增加 SsrfFileTypeFilter.checkSsrfHttpUrl(imageUrl) 的调用。
  • 该工具类会校验 URL 协议(仅限 http/https),并过滤 Loopback 和 Link-local 等敏感内网地址,从而在底层切断利用该接口发起 SSRF 攻击的可能性。
  • 修复方案完全复用了系统中已有的安全过滤组件,保障代码风格一致,且不会对前端的正常业务(如传入合法的外网图片地址进行图生图)造成任何影响。

复现步骤

  1. 在本地或任意能访问后端服务的机器上,使用 Python 开启一个模拟的内网服务(如 python -m http.server 8888)。
  2. 无需获取任何系统 Token,直接向目标接口发送精心构造的 POST 请求。
  3. 观察模拟内网服务的控制台,可发现收到了来自服务器的探测请求。

漏洞复现 POC (Windows CMD)

:: 请将 localhost:8080 替换为实际的服务地址
curl -X POST "http://localhost:8080/jeecg-boot/airag/chat/send" -H "Content-Type: application/json" -d "{""content"":""帮我处理这张图片"",""enableDraw"":true,""images"":[""http://127.0.0.1:8888/internal-ssrf-probe-test""]}"

效果对比

修改前 (Before):

匿名发送上述 POC 后,本地内网服务器(8888 端口)的控制台会留下明显的访问日志:
127.0.0.1 - - [01/Jun/2026 15:09:41] "GET /internal-ssrf-probe-test HTTP/1.1" 404 -
这证明 SSRF 探测成功,服务器作为跳板向内网发起了请求。同时前端或接口会返回类似 绘画AI调用失败:图片读取失败: http://127.0.0.1:8888/internal-ssrf-probe-test 的错误,但这发生在 SSRF 探测请求已经成功发送之后。

image

修改后 (After):

再次发送相同的 POC,内网服务器(8888 端口)不会收到任何请求,日志没有任何输出
JeecgBoot 后端由于在发起连接前被 SsrfFileTypeFilter 拦截,会直接抛出 JeecgBootException("非法URL:禁止访问本机或链路本地地址 127.0.0.1")。SSRF 攻击在最底层被成功阻断。

9c51e00f45b3d2203e34b61bca2153f

测试情况

  • 验证匿名用户传入内网回环地址(如 127.0.0.1)时,后端被安全拦截,未向目标地址发起请求。
  • 验证用户在前端页面传入正常外网图片,执行图生图功能时,功能流转正常,业务不受影响。

⚠️ 安全提示与免责声明 (Security Disclaimer)

请项目维护者尽快审核并合并此 PR,以避免潜在风险。

  1. 数据来源声明
    本 PR 中展示的所有敏感信息(如 18611111111jeecg@163.com)均来自 JeecgBoot 官方数据库文件中示例环境,非真实用户数据。我的测试环境是基于官方开源仓库的 fork。

  2. 严重性说明
    本 PR 修复了两个高危安全漏洞:

    • 越权访问与敏感信息泄露:低权限用户可通过批量查询接口,直接获取管理员等用户的手机号、邮箱等明文敏感信息。
    • SSRF 服务端请求伪造:匿名攻击者可利用未授权访问的图生图接口,传入内网地址,将服务器变为跳板对内网进行探测与攻击。
      这些漏洞一旦被恶意利用,后果严重。强烈建议立即合并此补丁,并通知所有用户升级。
  3. 致攻击者/黑产
    此公开信息旨在推动安全修复。如果你试图利用这些漏洞进行攻击,请知晓:修复补丁已在此 PR 中提供。攻击未修复的系统属于非法行为,所有后果由使用者自行承担。

Rangsh added 2 commits June 1, 2026 11:41
【问题描述】
SystemApiController 中的 queryUsersByUsernames 和 queryUsersByIds 接口直接返回了底层的 List<JSONObject>,遗漏了脱敏步骤。这导致低权限用户可越权获取其他用户(含管理员)的手机号、邮箱等敏感信息明文。

【修复方案】
- 遍历返回的 JSONObject,将其转换为 LoginUser 实体。
- 统一调用 SensitiveInfoUtil.handlerObject 执行脱敏规则。
- 采用 Fastjson 将脱敏后的实体回填至 JSONObject 中,确保对外输出数据安全且不影响原有业务逻辑。
- 问题:AIChatHandler.getFirstImageBase64() 处理外部 URL 时遗漏 SSRF 校验,结合 /airag/chat/send 接口的 @IgnoreAuth,匿名用户可构造恶意参数向内网发送探测请求。
- 修复:在读取网络图片前,调用内置的 SsrfFileTypeFilter.checkSsrfHttpUrl() 对 URL 进行严格校验。
- 效果:有效拦截针对 127.0.0.1、169.254.x.x 等 Loopback 及 Link-local 地址的非法探测,同时兼容常规的外部图片地址读取。
@Rangsh Rangsh changed the title fix(system): 修复[安全漏洞] SystemApiController 批量查询接口越权获取敏感信息明文;有复现过程 fix: [安全漏洞] 修复越权获取敏感信息明文与 SSRF 绕过漏洞组合 (SystemApiController + AIChatHandler);有复现过程 Jun 1, 2026
@Rangsh Rangsh changed the title fix: [安全漏洞] 修复越权获取敏感信息明文与 SSRF 绕过漏洞组合 (SystemApiController + AIChatHandler);有复现过程 fix: [安全漏洞] 修复越权访问与SSRF两个高危漏洞(附完整POC及复现过程) Jun 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant