13 KiB
Parameter Pollution | JSON Injection
Parameter Pollution
{% hint style="success" %}
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter'da 🐦 @hacktricks_live** takip edin.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
{% embed url="https://websec.nl/" %}
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 gibi araçlar, bu teknolojileri ve ayrıştırma davranışlarını tanımlamaya yardımcı olur.
PHP ve HPP İstismarı
OTP Manipülasyon 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, OTP üretimi için ilk email
parametresini işleyen ancak teslimat için sonuncusunu kullanan uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgulamaktadır.
API Anahtarı Manipülasyon Durumu:
- Senaryo: Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin veriyor.
- 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şfetti. - Teknik: Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli olmak üzere iki
api_key
parametresi içeren bir istek oluşturur. Sunucu, yalnızca sonuncusunu 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 vurgulamaktadır.
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 karşılaştığı ilk 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 adresinden alınmıştır.
PHP 8.3.11 VE Apache 2.4.62
- Parametre adında %00'dan sonrasını yok sayın.
- name[]'yi dizi olarak ele alın.
- _GET GET Yöntemini ifade etmez.
- Son parametreyi tercih edin.
Ruby 3.3.5 ve WEBrick 1.8.2
- Parametreleri ayırmak için & ve ; ayırıcılarını kullanır.
- name[] tanınmaz.
- İlk parametreyi tercih edin.
Spring MVC 6.0.23 VE Apache Tomcat 10.1.30
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
- POST RequestMapping & PostMapping name[]'yi tanır.
- name ve name[] mevcutsa name'i tercih edin.
- Parametreleri birleştirir, örneğin first,last.
- POST RequestMapping & PostMapping, Content-Type ile sorgu parametresini tanır.
NodeJS 20.17.0 VE Express 4.21.0
- name[]'yi tanır.
- Parametreleri birleştirir, örneğin first,last.
GO 1.22.7
- name[] tanınmaz.
- İlk parametreyi tercih edin.
Python 3.12.6 VE Werkzeug 3.0.4 VE Flask 3.0.3
- name[] tanınmaz.
- İlk parametreyi tercih edin.
Python 3.12.6 VE Django 4.2.15
- name[] tanınmaz.
- Son parametreyi tercih edin.
Python 3.12.6 VE Tornado 6.4.1
- name[] tanınmaz.
- Son parametreyi tercih edin.
JSON Injection
Çoğaltılmış anahtarlar
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:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Not edin ki bu durumlarda ön uç test == 1
olduğunu düşünebilirken, arka uç test == 2
olduğunu düşünebilir.
Bu, aşağıdaki gibi değer kısıtlamalarını aşmak için de kullanılabilir:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Yorum Kısaltmasını Kullanma
{% code overflow="wrap" %}
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
{% endcode %}
Burada her bir ayrıştırıcıdan serileştiriciyi kullanarak ilgili çıktısını göreceğiz.
Serileştirici 1 (örneğin, GoLang'ın GoJay kütüphanesi) şunları üretecektir:
description = "Yorumlarla tekrar"
test = 2
extra = ""
Serileştirici 2 (örneğin, Java'nın JSON-iterator kütüphanesi) şunları üretecektir:
description = "Yorumlarla tekrar"
extra = "/*"
extra2 = "*/"
test = 1
Alternatif olarak, yorumların basit kullanımı da etkili olabilir:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Java’nın GSON kütüphanesi:
{"description":"Comment support","test":1,"extra":"a"}
Ruby’nin simdjson kütüphanesi:
{"description":"Comment support","test":2,"extra":"a","extra2":"b"}
Tutarsız Öncelik: Deserialization vs. Serialization
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Float ve Tam Sayı
Sayı
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
birden fazla temsile çözülebilir, bunlar arasında:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Which might create inconsistences
References
- https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654
- https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution
- https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
- https://bishopfox.com/blog/json-interoperability-vulnerabilities
{% embed url="https://websec.nl/" %}
{% hint style="success" %}
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da 🐦 @hacktricks_live'i takip edin.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.