Prototype Pollution
Prototype pollution is a type of vulnerability that occurs in JavaScript when properties of Object.prototype are modified. This is particularly risky because JavaScript objects are dynamic and we can add properties to them at any time. Also, almost all objects in JavaScript inherit from Object.prototype, making it a potential attack vector.
Summary
Tools
yeswehack/pp-finder - Help you find gadget for prototype pollution exploitation
yuske/silent-spring - Prototype Pollution Leads to Remote Code Execution in Node.js
yuske/server-side-prototype-pollution - Server-Side Prototype Pollution gadgets in Node.js core code and 3rd party NPM packages
BlackFan/client-side-prototype-pollution - Prototype Pollution and useful Script Gadgets
portswigger/server-side-prototype-pollution - Burp Suite Extension detectiong Prototype Pollution vulnerabilities
msrkp/PPScan - Client Side Prototype Pollution Scanner
Methodology
In JavaScript, prototypes are what allow objects to inherit features from other objects. If an attacker is able to add or modify properties of Object.prototype, they can essentially affect all objects that inherit from that prototype, potentially leading to various kinds of security risks.
Examples
Imagine that an application uses an object to maintain configuration settings, like this:
An attacker might be able to add an
isAdminproperty toObject.prototype, like this:
Manual Testing
ExpressJS:
{ "__proto__":{"parameterLimit":1}}+ 2 parameters in GET request, at least 1 must be reflected in the response.ExpressJS:
{ "__proto__":{"ignoreQueryPrefix":true}}+??foo=barExpressJS:
{ "__proto__":{"allowDots":true}}+?foo.bar=bazChange the padding of a JSON response:
{ "__proto__":{"json spaces":" "}}+{"foo":"bar"}, the server should return{"foo": "bar"}Modify CORS header responses:
{ "__proto__":{"exposedHeaders":["foo"]}}, the server should return the headerAccess-Control-Expose-Headers.Change the status code:
{ "__proto__":{"status":510}}
Prototype Pollution via JSON Input
You can access the prototype of any object via the magic property __proto__. The JSON.parse() function in JavaScript is used to parse a JSON string and convert it into a JavaScript object. Typically it is a sink function where prototype pollution can happen.
Asynchronous payload for NodeJS.
Polluting the prototype via the constructor property instead.
Prototype Pollution in URL
Example of Prototype Pollution payloads found in the wild.
Prototype Pollution Exploitation
Depending if the prototype pollution is executed client (CSPP) or server side (SSPP), the impact will vary.
Remote Command Execution: RCE in Kibana (CVE-2019-7609)
Remote Command Execution: RCE using EJS gadgets
Client-side bypass: Prototype pollution – and bypassing client-side HTML sanitizers
Denial of Service
Prototype Pollution Payloads
Prototype Pollution Gadgets
A "gadget" in the context of vulnerabilities typically refers to a piece of code or functionality that can be exploited or leveraged during an attack. When we talk about a "prototype pollution gadget," we're referring to a specific code path, function, or feature of an application that is susceptible to or can be exploited through a prototype pollution attack.
Either create your own gadget using part of the source with yeswehack/pp-finder, or try to use already discovered gadgets yuske/server-side-prototype-pollution / BlackFan/client-side-prototype-pollution.
Labs
References
Last updated