Prototype Pollution
What is it?
Prototype Pollution is a vulnerability that occurs when an attacker manipulates the prototype of a JavaScript object. It exploits the dynamic nature of JavaScript, allowing an attacker to modify an object's structure and behavior.
This vulnerability is unique to JavaScript environments due to the language's flexible object model, where prototypes are shared between all objects of the same type. Consequently, a change to the prototype is reflected across all instances, potentially affecting the application's behavior globally.
There are mainly two types of Prototype Pollution:
Global Prototype Pollution: This involves manipulating JavaScript's built-in object prototypes, such as
Object.prototype,Array.prototype, etc. It can lead to various forms of attacks, such as adding, modifying, or deleting properties and methods, affecting the entire application.Local Prototype Pollution: This is more specific and involves manipulating the prototype of specific objects in the application. The impact is usually confined to the scope of those specific objects.
It's important to note that due to its nature, Prototype Pollution can lead to other kinds of attacks like:
Privilege escalation: By altering properties that control user privileges.
Remote Code Execution: By changing methods or properties related to function execution.
Denial of Service: By overloading methods or properties causing resource exhaustion.
Bypassing security measures: By altering validation or security checks.
For more details on Prototype Pollution see the relevant resources and child pages.
Prototype Pollution in Client-Side
Prototype Pollution is a JavaScript vulnerability that allows attackers to add arbitrary prooperties to global object prototypes. The vulnerability may exist in Node.js applications.
Investigation
Check if we can assign arbitrary property via URL. Try various ways.
Open browser console, and type the following to check if our above property is assigned.
DOM XSS
If our payload affects an HTML element after loading, we can inject DOM-based XSS as below.
Assume the key name of the property is "source_url", whose value is loaded as "src" in a script element. What property name is defined might be found by investigating JavaScript code assigned in the website.
Finding Gadgets
In browser, open DevTools and click the Sources (Chrome) or the Debugger (FireFox) tab, then find the JavaScript code which is affected by our pollution.
When found the line of the code, click the line number at the left of the line to add a breakpoint. Then reload the page.
The line that added as a breakpoint is highlighted. We can hover the target property to check the current value assigned.
Adjust for executing our payload while checking the property's value.
References
Payloads
Client-side prototype pollution
What is it?
Client-side Prototype Pollution is an attack that occurs when an attacker is able to manipulate the prototype of a JavaScript object. This can lead to unexpected behavior in the application, and sometimes lead to bypassing of security measures and Remote Code Execution.
A simple example
Consider this vulnerable JavaScript function:
If an we can control the source object and sets source.__proto__.isAdmin = true, then this will set isAdmin = true on all objects that inherit from Object, potentially leading to an escalation of privileges.
Note that payload or attack depends on the application and the structure of the code. Client-side Prototype Pollution can often lead to:
Privilege escalation
Security measures bypass
Data manipulation
Remote code execution
Other learning resources:
Writeups:
Checklist
Identify potential points of attack
User-supplied input that is directly used as an object
Functions that iterate over properties of user-supplied objects
Functions that use the Object or Function constructors with user input
Test the prototype
Can you add a new property to the prototype?
Can you modify an existing property on the prototype?
Can you delete a property from the prototype?
Test for privilege escalation
Add a new user privilege to the prototype
Modify an existing user privilege on the prototype
Delete a user privilege from the prototype
Test for security measures bypass
Add a new security property to the prototype
Modify an existing security property on the prototype
Delete a security property from the prototype
Is it actually exploitable?
Is there a blocklist?
Can you bypass the blocklist?
Test for insecure direct object references
Test for remote code execution
Test for patches
How does the application behave with patched libraries like Lodash, JQuery, etc.?
Is the patch effective or can it be bypassed?
Exploitation
Last updated