Parameter Pollution | JSON Injection
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.
HTTP Parameter Pollution (HPP) Overview
HTTP Parameter Pollution (HPP), saldırganların HTTP parametrelerini ekleyerek, değiştirerek veya çoğaltarak bir web uygulamasının davranışını istenmeyen şekilde değiştirdiği bir tekniktir. Bu manipülasyonlar kullanıcıya doğrudan görünmez, ancak sunucu tarafındaki uygulama işleyişini önemli ölçüde değiştirip istemci tarafında gözlemlenebilir etkiler oluşturabilir.
Example of HTTP Parameter Pollution (HPP)
Bir bankacılık uygulamasının işlem URL’si:
- Orijinal URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Ek bir from parametresi eklenerek:
- Manipüle Edilmiş URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
İşlem yanlışlıkla accountA yerine accountC’den tahsil edilebilir; bu durum HPP’nin işlemleri veya parola sıfırlama, 2FA ayarları veya API key talepleri gibi diğer işlevleri manipüle etme potansiyelini gösterir.
Technology-Specific Parameter Parsing
- Parametrelerin nasıl ayrıştırıldığı ve önceliklendirildiği, altında yatan 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ı belirlemede yardımcı olur.
PHP and HPP Exploitation
OTP Manipulation Case:
- Context: One-Time Password (OTP) gerektiren bir giriş mekanizması istismar edildi.
- Method: Burp Suite gibi araçlarla OTP isteği yakalanarak, HTTP isteğinde
emailparametresi çoğaltıldı. - Outcome: OTP, ilk email için üretilmiş olmasına rağmen, manipüle edilmiş istekte belirtilen ikinci e-posta adresine gönderildi. Bu kusur, amaçlanan güvenlik önlemini atlayarak yetkisiz erişime izin verdi.
Bu senaryo, uygulamanın backend’inde kritik bir eksikliğe işaret eder: OTP üretimi için ilk email parametresini işleyip, teslimat için sonuncusunu kullanmış olması.
API Key Manipulation Case:
- Scenario: Bir uygulama, kullanıcıların profil ayarları sayfasından API keylerini güncellemelerine izin veriyor.
- Attack Vector: Bir saldırgan, POST isteğine ek bir
api_keyparametresi ekleyerek API key güncelleme işlevinin sonucunu manipüle edebileceğini keşfeder. - Technique: Burp Suite gibi bir araç kullanarak, bir meşru ve bir kötü niyetli olmak üzere iki
api_keyparametresi içeren bir istek hazırlanır. Sunucu, yalnızca son tekrar edilen değeri işlediği için API key saldırganın verdiği değere güncellenir. - Result: Saldırgan, mağdurun API işlevleri üzerinde kontrol kazanır ve yetkisiz olarak özel verilere erişebilir veya bunları değiştirebilir.
Bu örnek, özellikle API key yönetimi gibi kritik özelliklerde güvenli parametre işleme gerekliliğini daha da vurgular.
Parameter Parsing: Flask vs. PHP
Farklı web teknolojilerinin duplicate HTTP parametreleri nasıl ele aldığı değişir ve bu da HPP saldırılarına yatkınlıklarını etkiler:
- Flask: Karşılaşılan ilk parametre değerini kullanır; örneğin query string
a=1&a=2durumundaa=1tercih edilir. - PHP (on Apache HTTP Server): Bunun aksine son parametre değerini tercih eder; verilen örnekte
a=2kullanılır. Bu davranış, saldırganın manipüle ettiği parametreyi orijinalinin yerine geçirebileceği şekilde HPP istismarlarını kolaylaştırabilir.
HPP Testing Notes (OWASP WSTG)
- HTTP standartları aynı isimde birden fazla parametrenin nasıl yorumlanacağını tanımlamaz, bu yüzden davranışlar farklı stack’ler ve bileşenler arasında değişir.
- Server-side HPP test ederken, her parametreyi query string’lerde veya gövdede çoğaltın ve uygulamanın değerleri birleştirip birleştirmediğini, ilk/son değeri kullanıp kullanmadığını veya hata verip vermediğini gözlemleyin.
- Client-side HPP için, yansıtılan bir parametre değerine URL-encoded bir
&(ör.%26HPP_TEST) enjekte edin ve oluşturulan linklerde veya form action’larda çözülmüş olarak&HPP_TESTveya&HPP_TESTgörünümlerini arayın.
Server-Side Parameter Pollution (SSPP) in Internal APIs
Bazı uygulamalar, kullanıcı girdisini internal API’lere yönelik sunucu tarafı isteklere yerleştirir. Bu girdi doğru şekilde encode edilmemişse, internal istekte parametre enjekte edebilir veya üzerine yazabilirsiniz. Query parametreleri, form alanları, header’lar ve URL path parametreleri dahil olmak üzere tüm kullanıcı girdilerini test edin.
Common probes:
- Yeni bir parametre eklemek için
%26(URL-encoded&) kullanın. - Downstream query’yi sonlandırmak için
%23(URL-encoded#) kullanın. - Var olan bir parametreyi üzerine yazmak için onu çoğaltın.
Örnek:
GET /userSearch?name=peter%26name=carlos&back=/home
Potansiyel olarak şu şekilde bir server-side request ile sonuçlanabilir:
GET /users/search?name=peter&name=carlos&publicProfile=true
Parameter pollution by technology
Bu sonuçlar https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89 adresinden alınmıştır
PHP 8.3.11 AND Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Parametre adındaki %00’den sonrasını yok say .
- name[]’i dizi olarak ele al .
- _GET GET Method anlamına gelmez .
- Son parametreyi tercih et .
Ruby 3.3.5 and WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Parametreleri ayırmak için & ve ; ayırıcılarını kullanır .
- name[] tanınmaz .
- İlk parametreyi tercih eder .
Spring MVC 6.0.23 AND Apache Tomcat 10.1.30
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping .
- POST RequestMapping & PostMapping name[]’i tanır .
- name ve name[] mevcutsa name’i tercih eder .
- Parametreleri birleştirir örn. first,last .
- POST RequestMapping & PostMapping Content-Type ile sorgu parametresini tanır .
NodeJS 20.17.0 AND Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- name[]’i tanır .
- Parametreleri birleştirir örn. first,last .
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- name[] tanınmaz .
- İlk parametreyi tercih eder .
Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- name[] tanınmaz .
- İlk parametreyi tercih eder .
Python 3.12.6 AND Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- name[] tanınmaz .
- Son parametreyi tercih eder .
Python 3.12.6 AND Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- name[] tanınmaz .
- Son parametreyi tercih eder .
JSON Injection
Tekrarlanan anahtarlar
obj = {"test": "user", "test": "admin"}
front-end anahtarın ilk örneğine inanabilirken backend anahtarın ikinci örneğini kullanabilir.
Key Collision: Character Truncation and Comments
Bazı karakterler frontend tarafından düzgün yorumlanmayacaktır; ancak backend bunları yorumlayıp o anahtarları kullanacaktır. Bu, bypass certain restrictions 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}
Bu durumlarda front end’in test == 1 olduğunu, backend’in ise test == 2 olduğunu düşünebileceğine dikkat edin.
Bu ayrıca şu tür değer kısıtlamalarını atlatmak için de kullanılabilir:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Yorum Kısaltma Kullanımı
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Burada her parser’dan alınan serializer’ı kullanarak ilgili çıktısını göreceğiz.
Serializer 1 (e.g., GoLang’s GoJay library) şunu üretecektir:
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (e.g., Java’s JSON-iterator library) şunu üretecektir:
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
Alternatif olarak, yorumların doğrudan kullanımı da etkili olabilir:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Java’ı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 Integer
Sayı
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
şunlar dahil olmak üzere birden fazla temsile çözümlenebilir:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Bu, tutarsızlıklara yol açabilir
Kaynaklar
-
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
-
https://portswigger.net/web-security/api-testing/server-side-parameter-pollution
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.


