hacktricks/src/pentesting-web/parameter-pollution.md

207 lines
11 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.

# Parameter Pollution | JSON Injection
{{#include ../banners/hacktricks-training.md}}
## HTTP Parameter Pollution (HPP) Genel Bakış
HTTP Parameter Pollution (HPP), saldırganların HTTP parametrelerini manipüle ederek bir web uygulamasının davranışını beklenmedik şekillerde değiştirdiği bir tekniktir. Bu manipülasyon, HTTP parametrelerini ekleyerek, değiştirerek veya çoğaltarak yapılır. Bu manipülasyonların etkisi kullanıcıya doğrudan görünmez, ancak uygulamanın sunucu tarafındaki işlevselliğini önemli ölçüde değiştirebilir ve istemci tarafında gözlemlenebilir etkiler yaratabilir.
### HTTP Parameter Pollution (HPP) Örneği
Bir bankacılık uygulaması işlem URL'si:
- **Orijinal URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
Ek bir `from` parametresi ekleyerek:
- **Manipüle Edilmiş URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
İşlem, `accountA` yerine yanlışlıkla `accountC`'ye tahsil edilebilir ve bu durum HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir.
#### **Teknolojiye Özgü Parametre Ayrıştırma**
- Parametrelerin nasıl ayrıştırıldığı ve önceliklendirildiği, temel web teknolojisine bağlıdır ve HPP'nin nasıl istismar edilebileceğini etkiler.
- [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) gibi araçlar, bu teknolojileri ve ayrıştırma davranışlarını tanımlamaya yardımcı olur.
### PHP ve HPP İstismarı
**OTP Manipülasyonu Durumu:**
- **Bağlam:** Tek Seferlik Şifre (OTP) gerektiren bir giriş mekanizması istismar edildi.
- **Yöntem:** Burp Suite gibi araçlar kullanarak OTP talebini kesen saldırganlar, HTTP isteğindeki `email` parametresini çoğalttı.
- **Sonuç:** İlk e-posta için tasarlanan OTP, manipüle edilmiş istekte belirtilen ikinci e-posta adresine gönderildi. Bu hata, amaçlanan güvenlik önlemini aşarak yetkisiz erişime izin verdi.
Bu senaryo, uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgular; ilk `email` parametresi OTP üretimi için işlenirken, teslimat için sonuncusu kullanıldı.
**API Anahtarı Manipülasyonu Durumu:**
- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin verir.
- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfeder.
- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli `api_key` parametresi içeren bir istek hazırlar. Sunucu, yalnızca son durumu işleyerek, API anahtarını saldırganın sağladığı değere günceller.
- **Sonuç:** Saldırgan, mağdurun API işlevselliği üzerinde kontrol kazanır ve muhtemelen özel verilere yetkisiz erişim veya değişiklik yapabilir.
Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgular.
### Parametre Ayrıştırma: Flask vs. PHP
Web teknolojilerinin çoğaltılmış HTTP parametrelerini ele alma şekli, HPP saldırılarına karşı duyarlılıklarını etkiler:
- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi ilk karşılaşılan parametre değerini benimser, ilk örneği sonraki çoğaltmalara tercih eder.
- **PHP (Apache HTTP Sunucusunda):** Aksine, son parametre değerini önceliklendirir ve verilen örnekte `a=2` seçilir. Bu davranış, saldırganın manipüle ettiği parametreyi orijinaline tercih ederek HPP istismarlarını istemeden kolaylaştırabilir.
## Teknolojiye Göre Parametre Kirliliği
Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) adresinden alınmıştır.
### PHP 8.3.11 VE Apache 2.4.62 <a href="#id-9523" id="id-9523"></a>
<figure><img src="../images/image (1255).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg</a></p></figcaption></figure>
1. Parametre adından %00 sonrasını yoksay.
2. name\[]'yi dizi olarak ele al.
3. \_GET GET Yöntemini ifade etmez.
4. Son parametreyi tercih et.
### Ruby 3.3.5 ve WEBrick 1.8.2
<figure><img src="../images/image (1257).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg</a></p></figcaption></figure>
1. Parametreleri ayırmak için & ve ; ayırıcılarını kullanır.
2. name\[] tanınmaz.
3. İlk parametreyi tercih et.
### Spring MVC 6.0.23 VE Apache Tomcat 10.1.30 <a href="#dd68" id="dd68"></a>
<figure><img src="../images/image (1258).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg</a></p></figcaption></figure>
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
2. POST RequestMapping & PostMapping name\[]'yi tanır.
3. name ve name\[] mevcutsa name'i tercih et.
4. Parametreleri birleştir, örneğin first,last.
5. POST RequestMapping & PostMapping, Content-Type ile sorgu parametresini tanır.
### **NodeJS** 20.17.0 **VE** Express 4.21.0 <a href="#id-6d72" id="id-6d72"></a>
<figure><img src="../images/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
1. name\[]'yi tanır.
2. Parametreleri birleştir, örneğin first,last.
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. İlk parametreyi tercih et.
### Python 3.12.6 VE Werkzeug 3.0.4 VE Flask 3.0.3 <a href="#b853" id="b853"></a>
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. İlk parametreyi tercih et.
### Python 3.12.6 VE Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. Son parametreyi tercih et.
### Python 3.12.6 VE Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. Son parametreyi tercih et.
## JSON Injection
### Çoğaltılmış anahtarlar
```ini
obj = {"test": "user", "test": "admin"}
```
Ön uç, ilk oluşumu doğru kabul edebilirken, arka uç anahtarın ikinci oluşumunu kullanabilir.
### Anahtar Çakışması: Karakter Kısaltma ve Yorumlar
Belirli karakterler ön uç tarafından doğru bir şekilde yorumlanmayabilir, ancak arka uç bunları yorumlayacak ve bu anahtarları kullanacaktır; bu, **belirli kısıtlamaları aşmak** için faydalı olabilir:
```json
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
```
Bu durumlarda ön yüzün `test == 1` olduğunu düşünürken, arka yüzün `test == 2` olduğunu düşünebileceğini unutmayın.
Bu, aşağıdaki gibi değer kısıtlamalarını aşmak için de kullanılabilir:
```json
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
```
### **Yorum Kısaltmasını Kullanma**
```ini
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
```
Burada her bir ayrıştırıcının serileştiricisini kullanarak ilgili çıktısını göreceğiz.
Serileştirici 1 (örneğin, GoLang'ın GoJay kütüphanesi) şunları üretecektir:
- `description = "Duplicate with comments"`
- `test = 2`
- `extra = ""`
Serileştirici 2 (örneğin, Java'nın JSON-iterator kütüphanesi) şunları üretecektir:
- `description = "Duplicate with comments"`
- `extra = "/*"`
- `extra2 = "*/"`
- `test = 1`
Alternatif olarak, yorumların basit kullanımı da etkili olabilir:
```ini
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
```
Javanın GSON kütüphanesi:
```json
{ "description": "Comment support", "test": 1, "extra": "a" }
```
Rubynin simdjson kütüphanesi:
```json
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
```
### **Tutarsız Öncelik: Deserialization vs. Serialization**
```ini
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
```
### Float ve Tam Sayı
Sayı
```undefined
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
```
birden fazla temsile çözülebilir, bunlar arasında:
```undefined
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
```
Hangi tutarsızlıklara yol açabilir
## Referanslar
- [https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654](https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654)
- [https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution)
- [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
- [https://bishopfox.com/blog/json-interoperability-vulnerabilities](https://bishopfox.com/blog/json-interoperability-vulnerabilities)
{{#include ../banners/hacktricks-training.md}}