Parameter Pollution | JSON Injection

Tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

HTTP Parameter Pollution (HPP) Overview

HTTP Parameter Pollution (HPP) ni mbinu ambapo washambulizi hurekebisha vigezo vya HTTP ili kubadilisha tabia ya web application kwa njia zisizokusudiwa. Uchezaji huu hufanywa kwa kuongeza, kubadilisha, au kurudia vigezo vya HTTP. Athari za uchezaji huu hazionekani moja kwa moja kwa mtumiaji lakini zinaweza kubadilisha kwa kiasi kikubwa utendakazi wa application upande wa server, na kuleta athari zinazoonekana upande wa client.

Example of HTTP Parameter Pollution (HPP)

URL ya muamala wa application ya benki:

  • Original URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000

By inserting an additional from parameter:

  • Manipulated URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC

Muamala unaweza kutochajiwa kwa usahihi kwenye accountC badala ya accountA, ikionesha uwezo wa HPP kuendeleza udhibiti wa miamala au kazi nyingine kama vile reset ya password, mipangilio ya 2FA, au maombi ya API key.

Technology-Specific Parameter Parsing

  • Jinsi vigezo vinavyotazamwa na kupangiwa kwa kipaumbele inategemea teknolojia ya msingi ya wavuti, ikibadilisha jinsi HPP inaweza kutumika.
  • Vifaa kama Wappalyzer husaidia kutambua teknolojia hizi na jinsi zinavyofanya uchambuzi wa vigezo.

PHP and HPP Exploitation

OTP Manipulation Case:

  • Context: Mchakato wa kuingia uliotegemea One-Time Password (OTP) ulikumbwa na udhaifu.
  • Method: Kwa kukamata ombi la OTP kwa kutumia zana kama Burp Suite, washambulizi walirudia parameter email katika ombi la HTTP.
  • Outcome: OTP, iliyokusudiwa kwa barua kali ya kwanza, badala yake ilitumwa kwa anwani ya pili ya barua iliyotajwa katika ombi lililosababisha mabadiliko. Hitilafu hii iliruhusu ufikaji usioidhinishwa kwa kupita hatua ya usalama iliyokusudiwa.

Mfano huu unaonyesha kosa muhimu upande wa backend wa application, uliochakata parameter ya kwanza email kwa ajili ya uzalishaji wa OTP lakini ukatumia parameter ya mwisho kwa ajili ya utoaji.

API Key Manipulation Case:

  • Scenario: Application inaruhusu watumiaji kusasisha API key yao kupitia ukurasa wa mipangilio ya profile.
  • Attack Vector: Mshambuliaji anakuta kuwa kwa kuongeza parameter ya ziada api_key kwenye ombi la POST, anaweza kuathiri matokeo ya kazi ya sasisho la API key.
  • Technique: Kwa kutumia zana kama Burp Suite, mshambuliaji anatengeneza ombi linalojumuisha api_key mbili: moja halali na moja yenye hatari. Server, ukichakata mara ya mwisho tu, unasasisha API key kwa thamani iliyotolewa na mshambuliaji.
  • Result: Mshambuliaji anapata udhibiti wa kazi za API za mhusika, ikiwezekana kufikia au kubadilisha data binafsi bila idhini.

Mfano huu unaongeza umuhimu wa kushughulikia vigezo kwa usalama, hasa katika vipengele muhimu kama usimamizi wa API key.

Parameter Parsing: Flask vs. PHP

Jinsi teknolojia za wavuti zinavyoshughulikia vigezo vilivyorejeshwa vya HTTP hutofautiana, na hivyo kuathiri unyeti wao kwa mashambulizi ya HPP:

  • Flask: Inachukua thamani ya parameter ya kwanza iliyopatikana, kama a=1 kwenye query string a=1&a=2, ikipa kipaumbele mfano wa kwanza kuliko nakala zinazofuata.
  • PHP (on Apache HTTP Server): Kinyume chake, inampa kipaumbele thamani ya mwisho ya parameter, ikichagua a=2 katika mfano uliotolewa. Tabia hii kwa bahati mbaya inaweza kurahisisha matumizi ya HPP kwa kuzingatia parameter iliyobadilishwa na mshambuliaji badala ya asili.

HPP Testing Notes (OWASP WSTG)

  • Viwango vya HTTP havielezi jinsi ya kutafsiri vigezo vingi vyenye jina moja, hivyo tabia inatofautiana kati ya stacks na vipengele.
  • Unapofanya majaribio ya HPP upande wa server, rudia kila parameter kwenye query strings au bodies na tazama kama application inachanganya thamani, inatumia kwanza/ya mwisho, au inaleta kosa.
  • Kwa HPP upande wa client, weka & iliyofumwa kwa URL katika thamani ya parameter inayorejeshwa (mfano, %26HPP_TEST) na tazama matukio yaliyotafsiriwa kama &HPP_TEST au &HPP_TEST ndani ya links zilizotengenezwa au vitendo vya form.

Server-Side Parameter Pollution (SSPP) in Internal APIs

Baadhi ya applications zinaingiza pembejeo za mtumiaji ndani ya maombi ya upande wa server kwa internal APIs. Ikiwa pembejeo hiyo haijawekwa kwa usahihi, unaweza kuingiza au kubadilisha vigezo katika ombi la ndani. Jaribu pembejeo yoyote ya mtumiaji, ikiwa ni pamoja na query parameters, form fields, headers, na URL path parameters.

Common probes:

  • Add a new parameter with %26 (URL-encoded &).
  • Truncate the downstream query with %23 (URL-encoded #).
  • Override an existing parameter by duplicating it.

Example:

GET /userSearch?name=peter%26name=carlos&back=/home

Inaweza kusababisha server-side request kama:

GET /users/search?name=peter&name=carlos&publicProfile=true

Parameter pollution kwa teknolojia

Matokeo haya yalichukuliwa kutoka https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89

PHP 8.3.11 NA Apache 2.4.62

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

  1. Puuzilia chochote baada ya %00 katika jina la parameter .
  2. Hushughulikia name[] kama array .
  3. _GET haimaanishi GET Method .
  4. Inapendelea parameter ya mwisho .

Ruby 3.3.5 na WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

  1. Inatumia delimiters & na ; kugawanya parameters .
  2. Haikutambuliwa name[] .
  3. Inapendelea parameter ya kwanza .

Spring MVC 6.0.23 NA Apache Tomcat 10.1.30

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

  1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping .
  2. POST RequestMapping & PostMapping zinatambua name[] .
  3. Inapendelea name ikiwa name na name[] zipo .
  4. Hunganisha parameters mfano first,last .
  5. POST RequestMapping & PostMapping zinatambua query parameter pamoja na Content-Type .

NodeJS 20.17.0 NA Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

  1. Inatambua name[] .
  2. Hunganisha parameters mfano first,last .

GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

  1. Haikutambuliwa name[] .
  2. Inapendelea parameter ya kwanza .

Python 3.12.6 NA Werkzeug 3.0.4 NA Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

  1. Haikutambuliwa name[] .
  2. Inapendelea parameter ya kwanza .

Python 3.12.6 NA Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

  1. Haikutambuliwa name[] .
  2. Inapendelea parameter ya mwisho .

Python 3.12.6 NA Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

  1. Haikutambuliwa name[] .
  2. Inapendelea parameter ya mwisho .

JSON Injection

JSON, XML and YAML Hacking

Vifunguo vinavyojirudia

obj = {"test": "user", "test": "admin"}

Front-end inaweza kuamini tukio la kwanza wakati backend inatumia tukio la pili la key.

Key Collision: Character Truncation and Comments

Baadhi ya characters hazitatafsiriwa ipasavyo na front-end, lakini backend itazitafsiri na kuzitumia; hii inaweza kuwa muhimu bypass certain restrictions:

{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}

Angalia jinsi katika kesi hizi frontend inaweza kufikiri kwamba test == 1 na backend itafikiri kwamba test == 2.

Hii pia inaweza kutumika ku-bypass vikwazo vya thamani kama:

{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}

Kutumia Kukata Maoni

obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}

Hapa tutatumia serializer kutoka kwa kila parser ili kuona output yake.

Serializer 1 (e.g., GoLang’s GoJay library) itatoa:

  • description = "Duplicate with comments"
  • test = 2
  • extra = ""

Serializer 2 (e.g., Java’s JSON-iterator library) itatoa:

  • description = "Duplicate with comments"
  • extra = "/*"
  • extra2 = "*/"
  • test = 1

Vinginevyo, matumizi rahisi ya comments pia yanaweza kuwa ya ufanisi:

obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}

Maktaba ya GSON ya Java:

{ "description": "Comment support", "test": 1, "extra": "a" }

Maktaba ya simdjson ya Ruby:

{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }

Kipaumbele Kisicho Thabiti: Deserialization vs. Serialization

obj = {"test": 1, "test": 2}

obj["test"] // 1
obj.toString() // {"test": 2}

Float and Integer

Nambari

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

inaweza kutafsiriwa kwa uwakilishi mbalimbali, ikiwa ni pamoja na:

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Ambazo zinaweza kusababisha kutokubaliana

Marejeleo

Tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks