Nosql מקיף מגוון רחב של טכנולוגיות מסדי נתונים לא יחסיים הנמצאות בשימוש נרחב ביישומים מודרניים לתמיכה בסכמות גמישות ובמדרגיות אופקית. למרות יתרונותיהם, מערכות NoSQL אינן מאובטחות מטבען – על המפתחים להבין זאת. פגיעויות הזרקת NoSQL, כיצד תוקפים יכולים לנצל אותם וכיצד להתגונן מפניהם באופן שיטתי. מאמר זה מספק ניתוח טכני מעמיק למהנדסי אבטחה, כולל תרחישי איום אמיתיים, אסטרטגיות מניעה, דוגמאות קוד והפניות ל-CVE בעלי השפעה רבה.
מהו NoSQL ומדוע הוא חשוב לאבטחה
מאגרי NoSQL (קיצור של "Not Only SQL" או "non-relational SQL") נוטשים את המודלים היחסיים המסורתיים לטובת מודלים גמישים יותר, כגון מאגרי ערך-מפתח, מאגרי מסמכים, משפחת עמודות ומאגרי גרפים. יישומים פופולריים כוללים: MongoDB, CouchDB, Redis, קאסנדרה, ו Neo4j. מערכות אלה מספקות מדרגיות וגמישות סכמטית, אך הן גם מציגות סמנטיקה חדשה של שאילתות ומלכודות אבטחה לא מוכר למהנדסים המורגלים במערכות SQL. vaadata.com
בניגוד ל-SQL, לכל מערכת NoSQL יש שפת שאילתות משלה (למשל, שאילתות מבוססות JSON ב-MongoDB) וסמנטיקה שונה של אופרטורים. אמנם גיוון זה משפר את הגמישות, אך הוא גם גורם ל וקטורי התקפה ייחודיים באמצעות הזרקה מכיוון שקלט המשתמשים לעתים קרובות מוחדר לשאילתות מסד נתונים ללא טיהור נאות. vaadata.com
הזרקת NoSQL: מה זה ומתי זה קורה
בעיקרו של דבר, הזרקת NoSQL מתרחשת כאשר תוקף שולח קלט מעוצב המשנה את המבנה המיועד של שאילתת מסד נתונים. בניגוד לדקדוק המסורתי המבוסס על טקסט של הזרקת SQL, הזרקת NoSQL לעתים קרובות עושה שימוש לרעה מטעני JSON או אופרטורי שאילתה כגון $ne, $gt, $lt, $regex, או $איפה לשלוט בהיגיון. vaadata.com
דוגמאות ותרחישים מהעולם האמיתי
הבה נבחן קטע קוד טיפוסי של Node.js + MongoDB לאימות, שבו מפתחים משתמשים ישירות בקלט של הלקוח כדי לשאול את פרטי ההזדהות:
javascript
// אימות פגיע
db.users.find({
דוא"ל: req.body.email,
סיסמה: req.body.password
});
תוקף יכול לספק ערך כמו:
json
{ "דוא"ל": { "$ne": null }, "סיסמה": { "$ne": null } }
שאילתה זו מחזירה מסמכים שבהם כתובת הדוא"ל היא לא null והסיסמה היא לא null, תוך עקיפת האימות ביעילות מבלי לדעת את פרטי הזיהוי התקפים. vaadata.com
מאגרי NoSQL טיפוסיים והיכן מתרחשת הזרקה
| סוג מסד הנתונים | דוגמאות | סיכון הזרקה |
|---|---|---|
| חנות מסמכים | MongoDB, CouchDB | גבוה — שאילתות JSON וביצוע JS |
| ערך מפתח | Redis, DynamoDB | בינוני — הערכת סקריפט או פעולות מורכבות דורשות שימוש זהיר |
| משפחת עמודות | קאסנדרה, HBase | סיכון אינטרפולציה בינוני |
| גרף | Neo4j | שפות שאילתה גבוהות כמו Cypher ניתנות למניפולציה |
כל מודל מציג פרופיל סיכון שונה בשל הבדלים בשפת השאילתה. לדוגמה, MongoDB מאפשר שאילתות באמצעות אופרטורים כמו $איפה המבצעים JavaScript שרירותי, מה שמגדיל את שטח התקיפה. InfoQ

דוגמאות ל-CVE בעלות השפעה רבה הקשורות להזרקת NoSQL
אמנם הזרקת NoSQL נוטה להיות מדווחת פחות בהשוואה להזרקת SQL, אך בעיות אבטחה מתועדות מראות כי הן אמיתיות מאוד. לדוגמה:
- CVE-2024-48573: הזרקת NoSQL ב-Aquila CMS אפשרה לתוקף לאפס סיסמאות חשבון מכיוון שהמסננים שסופקו על ידי המשתמשים לא עברו ניקוי, מה שאפשר הזרקת מפעיל זדוני. vaadata.com
באגים אחרים שדווחו (למשל, בעיות עם $איפה שימוש לא נכון ב-ODM) מחזקים את הטענה שוקטורי הזרקה עשויים להיווצר לא רק מקוד היישום, אלא גם מ ספרייה או טיפול בסכימה לא מאובטחים. אבטחה בהירה
כיצד ניתן לנצל הזרקת NoSQL
השפעתן של התקפות הזרקת NoSQL משתנה בהתאם למסד הנתונים ולרמת האבטחה. הן יכולות לשמש למטרות הבאות:
- עקיפת לוגיקת האימות
- חלץ רשומות רגישות
- שינוי או מחיקה של נתונים קריטיים
- העלאת הרשאות
- הפעלת פגיעויות ביישומים משניים (לדוגמה, RCE באמצעות ביצוע JavaScript)
דוגמה: עקיפת אימות
javascript
// המטען של התוקף משנה את לוגיקת השאילתה
db.users.find({
דוא"ל: { $regex: ".*" },*
*סיסמה: { $regex: ".*" }
});
זה תואם לכל אישורים מכיוון ש .* הוא ביטוי רגולרי שמתאים לכל דבר — ובכך עוקף את בדיקות הכניסה. vaadata.com
איתור הזרקת NoSQL
בדיקת הזרקת NoSQL כוללת:
- זיהוי נקודות שבהן קלט המשתמש מועבר ישירות לשאילתות מסד נתונים
- טשטוש פרמטרי משתמש עם מקשי מפעיל כמו
$ne,$gt,$lt - תצפית בשינויים בהתנהגות היישום (לדוגמה, עקיפת אימות, הבדלים בתוצאות שאילתות)
- בדיקות באמצעות סורקים אוטומטיים וטכניקות בדיקה ידניות Indusface
מהנדסים מסתמכים לעתים קרובות על בדיקות ידניות וכלים אוטומטיים כדי לדמות מטענים זדוניים.
אסטרטגיות הגנה: אימות קלט וחיזוק שאילתות
המהות של ההגנה מפני הזרקת NoSQL היא טיפול כל קלט המשתמש כלא אמין ולמנוע כל אפשרות שהקלט ישנה את מבנה השאילתה.

שיטות עבודה מומלצות
- אימות קלט והוספה לרשימת הלבנים אפשר רק שדות וסוגי נתונים צפויים. דחה או נקה תווים מיוחדים ומפעילים JSON שעלולים לשנות את לוגיקת השאילתה. Indusface
- שאילתות פרמטריות/מוכנות למרות ש-NoSQL אינו כולל הצהרות מוכנות אוניברסליות, נהגים רבים תומכים בבוני שאילתות בטוחים יותר, המונעים שרשור מחרוזות.
- אימות סכימה השתמש בסכמות מסמכים או באימות מודלים (לדוגמה, סכמות Mongoose) כדי לאכוף צורות קלט צפויות.
- השבתת מפעילים מסוכנים השבת הערכה של
$איפה,$eval, או ביצוע JavaScript בתצורות מסד נתונים. Indusface - מדיניות הרשאות מינימליות הגבל את הרשאות המשתמשים בבסיס הנתונים כך שגם אם תתרחש הזרקה, טווח ההשפעה של הפעולות (קריאה/כתיבה) יהיה מוגבל.
- רישום וניטור תעד דפוסי שאילתות חריגים כדי לזהות ניסיונות הזרקה ולהפעיל התראות.
דוגמאות קוד: דפוסי התקפה לעומת הגנה
להלן קטעי קוד מעשיים הממחישים הן את הניצול והן את ההפחתה.
התקפת עקיפת אימות MongoDB
javascript
// לא בטוח: קלט ישיר של המשתמש בשאילתה
db.users.find({
שם משתמש: req.body.user,
סיסמה: req.body.pass
});
דפוס הגנה: רשימת לבנה וקלטות יציקה
javascript
const userInput = {
משתמש: מחרוזת (req.body.user || ""),
pass: מחרוזת (req.body.pass || "")
};
db.users.find({ username: userInput.user, password: userInput.pass });
שימוש לרעה בביטויים רגולריים בשאילתות
מטען התקפה:
json
{ "name": { "$regex": ".*" } }
הגנה (אל תאפשר Regex):
javascript
if (!/^[A-Za-z0-9_]+$/.test(req.body.name)) {
זרוק שגיאה חדשה ("תווים לא חוקיים");
}
מניעת ביצוע JavaScript ב-MongoDB
לא בטוח:
javascript
db.users.find({ $where: "this.age > 25" });
תצורה בטוחה:
לנזוף
# mongod.conf
setParameter:
javascriptEnabled: false
סימולציית שאילתה פרמטרית
לא בטוח:
javascript
collection.find({ filter: JSON.parse(req.body.filter) });
ניתוח בטוח עם ספריית טיהור
javascript
const sanitize = require('mongo-sanitize');
const filter = sanitize(req.body.filter);
collection.find(filter);
סינון קלט REST API
פגיע:
javascript
app.post("/search", (req, res) =>
db.collection("items").find(req.body).toArray()
);
ממוקדם:
javascript
const allowedFields = ["category", "price"];
const query = {};
allowedFields.forEach(f => {
if (req.body[f]) query[f] = req.body[f];
});
db.collection("items").find(query).toArray();
בדיקות אבטחה NoSQL אוטומטיות וקפדניות
ביישומים מורכבים, זיהוי ידני של כל וקטור הזרקה ב-API, קלט דינמי ומיקרו-שירותים הוא לעתים קרובות בלתי אפשרי. Penligent, פלטפורמת בדיקות חדירה מבוססת בינה מלאכותית, מסייעת לצוותי אבטחה באמצעות:
- יצירה והזרקה אוטומטית של מטעני NoSQL מתוחכמים כדי לאתר נקודות תורפה
- קישור בין דפוסי שאילתות להתנהגויות בסיכון גבוה
- שילוב עם צינורות CI/CD כדי לאתר רגרסיות בשלב מוקדם
- הפקת דוחות לפי סדר עדיפויות בהתאם לסיווגים של OWASP ו-CWE
גישה זו משלימה את SAST/DAST המסורתי עם ניתוח המותאם להקשר, שימושי במיוחד עבור שפות שאילתות NoSQL דינמיות, שבהן כללים סטטיים בלבד עשויים להיות לא מספיקים.
מסקנה: NoSQL אינו חסין — יש לתכנן בצורה מאובטחת
מאגרי NoSQL מציעים מדרגיות וגמישות, אך הם אינם חסינים מפני סיכוני הזרקה רק משום שהם משתמשים בתחביר שונה. פגמים בהזרקה ב-NoSQL יכולים לעקוף אימות, לחשוף נתונים או לאפשר פעולות לא מורשות כאשר הקלט מטופל באופן לא תקין. על ידי שילוב של אימות קלט חזק, אכיפת סכמה, שימוש מאובטח במנהלי התקנים ובדיקות אוטומטיות (כולל פלטפורמות המסייעות ב-AI כמו Penligent), מהנדסים יכולים להפחית באופן משמעותי את החשיפה להתקפות הזרקת nosql.

