JSON, XML & Yaml Hacking & Issues

Reading time: 4 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ğrulamayı atlatmak, yetkileri yükseltmek veya hassas verileri sızdırmak 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 veren yapıların istismar edilmesidir (ö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ı ayrıştırıcıların aynı yükü nasıl farklı yorumladığını istismar ederek yetkilendirmeyi atlatmaktır, örneğin:

  • CVE-2017-12635: Tekrar eden anahtarlar aracılığıyla Apache CouchDB atlatması
  • 2022: XML ayrıştırıcı 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 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ği güvenilir buldu.

  • Ö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

🔐 Önlemler

RiskÇözüm
Bilinmeyen alanlardecoder.DisallowUnknownFields()
Tekrarlanan alanlar (JSON)❌ stdlib'de çözüm yok
Büyük/küçük harf duyarsız eşleşme❌ stdlib'de çözüm yok
XML atık veriler❌ stdlib'de çözüm yok
YAML: bilinmeyen anahtarlaryaml.KnownFields(true)

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