واجهة الغربان تستقبل دخولا بصيغة JSON وتبني منه فلتر استعلام قاعدة بيانات المستندات مباشرة فإذا جعلت كلمة المرور كائن معامل مثل ne يطابق أي كلمة مرور وتدخل كـ admin
شاشة دخول ترسل JSON فيه username و password. الخادم يمرر القيمتين كما هما إلى فلتر الاستعلام فإذا كانت password كائن معامل بدل نص غير معنى الاستعلام
لماذا نجح الحل
القيم من الـ JSON دخلت فلتر الاستعلام بلا تحقق من نوعها فصارت معاملات تتحكم في المطابقة الحل فرض أن تكون القيم نصوصا وعدم تمرير كائنات المستخدم إلى الفلتر
السبب الجذري
تمرير قيم المستخدم من JSON إلى فلتر الاستعلام بلا تحقق من النوع فتصير معاملات الجذر الثقة في بنية مدخل المستخدم
كيف يصلح الكود
افرض أن تكون قيم الدخول نصوصا ولا تمرر كائنات المستخدم إلى فلتر الاستعلام
الكود المصاب
app.post('/login', (req, res) => {
// req.body.password may be { $ne: null } and still flow into the query.
const user = db.users.findOne({ username: req.body.username, password: req.body.password });
});
الكود الآمن
app.post('/login', (req, res) => {
const { username, password } = req.body;
if (typeof username !== 'string' || typeof password !== 'string') return res.status(400).end();
const user = db.users.findOne({ username, password: hash(password) });
});
الأثر في الواقع
حقن NoSQL يتجاوز الدخول ويسرب بيانات ويعدلها في قواعد المستندات وهو شائع في واجهات تقبل JSON
كيف يكتشفها المدافعون
المدافع يتحقق من نوع كل حقل ويرفض الكائنات حيث يتوقع نصا ويرصد قيما تحوي مفاتيح تبدأ بالدولار