Parameter Pollution | JSON Injection

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

HTTP Parameter Pollution (HPP) Oorsig

HTTP Parameter Pollution (HPP) is ’n tegniek waar aanvalleurs HTTP-parameters manipuleer om die gedrag van ’n webtoepassing op onbedoelde maniere te verander. Hierdie manipulasie word gedoen deur HTTP-parameters by te voeg, te wysig of te dupliseer. Die effek van hierdie manipulasies is nie direk sigbaar vir die gebruiker nie, maar kan die toepassing se funksionaliteit aan die bedienerkant aansienlik verander, met waarneembare impakte aan die kliëntkant.

Voorbeeld van HTTP Parameter Pollution (HPP)

’n Banktoepassing se transaksie-URL:

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

Deur ’n addisionele from-parameter in te voeg:

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

Die transaksie kan verkeerdelik toegeskryf word aan accountC in plaas van accountA, wat die potensiaal van HPP toon om transaksies of ander funksies soos wagwoordherstel, 2FA-instellings of API key versoeke te manipuleer.

Tegnologie-spesifieke parameterontleding

  • Die manier waarop parameters gepars en geprioritiseer word, hang af van die onderliggende webtegnologie en beïnvloed hoe HPP uitgebuit kan word.
  • Gereedskap soos Wappalyzer help om hierdie tegnologieë en hul parsingsgedrag te identifiseer.

PHP en HPP-uitbuiting

OTP Manipulasie-geval:

  • Konstekst: ’n Login-meganisme wat ’n One-Time Password (OTP) vereis is uitgebuit.
  • Metode: Deur die OTP-versoek met hulpmiddele soos Burp Suite te onderskep, het aanvalleurs die email-parameter in die HTTP-versoek gedupliseer.
  • Uitkoms: Die OTP, bedoel vir die oorspronklike email, is in plaas daarvan na die tweede emailadres gestuur wat in die gemanipuleerde versoek gespesifiseer is. Hierdie fout het ongemagtigde toegang moontlik gemaak deur die bedoelde sekuriteitsmaatreël te omseil.

Hierdie scenario beklemtoon ’n kritieke oorsig in die toepassing se backend, wat die eerste email-parameter vir OTP-generering verwerk het maar die laaste vir aflewering gebruik het.

API Key Manipulasie-geval:

  • Scenario: ’n Toepassing laat gebruikers toe om hul API key via ’n profielinstellingsbladsy te werk.
  • Aanvalvektor: ’n Aanvalluer ontdek dat deur ’n addisionele api_key-parameter by die POST-versoek te heg, hulle die uitkoms van die API key-opdateringsfunksie kan manipuleer.
  • Tegniek: Deur ’n hulpmiddel soos Burp Suite te gebruik, maak die aanvaller ’n versoek wat twee api_key-parameters insluit: een wettige en een kwaadwillige. Die bediener, wat slegs die laaste voorkoms verwerk, werk die API key by na die waarde wat die aanvaller voorsien het.
  • Resultaat: Die aanvaller kry beheer oor die slagoffer se API-funksionaliteit en kan moontlik privaat data ongemagtig bekostig of wysig.

Hierdie voorbeeld beklemtoon verder die noodsaaklikheid van veilige parameterhantering, veral in funksies so kritiek soos API key bestuur.

Parameterontleding: Flask vs. PHP

Die manier waarop webtegnologieë duplikaat HTTP-parameters hanteer verskil, wat hulle vatbaar vir HPP-aanvalle beïnvloed:

  • Flask: Neem die eerste parameterwaarde wat teëgekom word, soos a=1 in ’n query string a=1&a=2, en prioritiseer die aanvanklike insident bo opvolgende duplikate.
  • PHP (on Apache HTTP Server): Inteendeel, prioritiseer die laaste parameterwaarde, en kies byvoorbeeld a=2 in die gegewe voorbeeld. Hierdie gedrag kan per ongeluk HPP-uitbuitings vergemaklik deur die gemanipuleerde parameter van die aanvaller bo die oorspronklike te eer.

HPP Toetsnota’s (OWASP WSTG)

  • HTTP-standaarde definieer nie hoe om verskeie parameters met dieselfde naam te interpreteer nie, dus wissel gedrag oor stacks en komponente.
  • Wanneer jy server-side HPP toets, dupliseer elke parameter in query strings of bodies en waarneem of die toepassing waardes konkatenateer, eerste/laaste gebruik, of ’n fout gooi.
  • Vir client-side HPP, injekteer ’n URL-geënkodeerde & in ’n gereflekteerde parameterwaarde (bv. %26HPP_TEST) en soek na gedekodeerde voorkomste soos &HPP_TEST of &HPP_TEST binne genereerde skakels of form actions.

Server-Side Parameter Pollution (SSPP) in Interne APIs

Sommige toepassings sit gebruikersinvoer in server-side versoeke na interne APIs. As daardie inset nie behoorlik geënkodeer is nie, kan jy parameters in die interne versoek injekteer of oorroep. Toets enige gebruikersinvoer, insluitend query parameters, form velde, headers, en URL path parameters.

Algemene probes:

  • Voeg ’n nuwe parameter by met %26 (URL-geënkodeerde &).
  • Trunkateer die downstream query met %23 (URL-geënkodeerde #).
  • Oorrol ’n bestaande parameter deur dit te dupliseer.

Example:

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

Dit kan moontlik lei tot ’n server-side request soos:

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

Parameter pollution by technology

Die resultate is geneem van https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89

PHP 8.3.11 AND Apache 2.4.62

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

  1. Ignoreer enigiets ná %00 in die parameternaam.
  2. Hanteer name[] as array.
  3. _GET beteken nie GET Method nie.
  4. Gee voorkeur aan die laaste parameter.

Ruby 3.3.5 and WEBrick 1.8.2

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

  1. Gebruik die & en ; delimiters om parameters te skei.
  2. Erken name[] nie.
  3. Gee voorkeur aan die eerste parameter.

Spring MVC 6.0.23 AND 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 herken name[] .
  3. Gee voorkeur aan name indien name AND name[] bestaan.
  4. Konkateer parameters, bv. first,last.
  5. POST RequestMapping & PostMapping herken query parameter met Content-Type.

NodeJS 20.17.0 AND Express 4.21.0

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

  1. Herken name[].
  2. Konkateer parameters, bv. first,last.

GO 1.22.7

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

  1. Herken name[] nie.
  2. Gee voorkeur aan die eerste parameter.

Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3

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

  1. Herken name[] nie.
  2. Gee voorkeur aan die eerste parameter.

Python 3.12.6 AND Django 4.2.15

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

  1. Herken name[] nie.
  2. Gee voorkeur aan die laaste parameter.

Python 3.12.6 AND Tornado 6.4.1

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

  1. Herken name[] nie.
  2. Gee voorkeur aan die laaste parameter.

JSON Injection

JSON, XML and YAML Hacking

Dubbele sleutels

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

Die front-end mag die eerste voorkoms glo, terwyl die backend die tweede voorkoms van die sleutel gebruik.

Key Collision: Character Truncation and Comments

Sekere karakters sal nie korrek deur die frontend geïnterpreteer word nie, maar die backend sal hulle interpreteer en daardie sleutels gebruik; dit kan nuttig wees om bypass certain restrictions:

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

Let daarop dat in hierdie gevalle die front-end dalk dink dat test == 1 en die backend sal dink dat test == 2.

Dit kan ook gebruik word om waardebeperkings te omseil soos:

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

Gebruik Comment Truncation

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

Hier gebruik ons die serializer van elke parser om die ooreenstemmende uitset te sien.

Serializer 1 (bv., GoLang’s GoJay library) sal die volgende produseer:

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

Serializer 2 (bv., Java’s JSON-iterator library) sal die volgende produseer:

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

Alternatiewelik kan eenvoudige gebruik van kommentaar ook effektief wees:

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

Java se GSON-biblioteek:

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

Ruby’s simdjson biblioteek:

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

Inkonsekwente Voorrang: Deserialization vs. Serialization

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

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

Float en Integer

Die getal

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

kan na verskeie voorstellings gedekodeer word, insluitend:

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Wat moontlik inkonsekwenthede kan veroorsaak

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks