הזרקת NoSQL - תרגיל¶
תרגיל 1 - עקיפת אותנטיקציה¶
PortSwigger Lab: Exploiting NoSQL operator injection to bypass authentication
משימות¶
- גשו לעמוד ההתחברות של האפליקציה
- נסו להתחבר עם פרטים רגילים ובדקו את הבקשה ב-Burp Suite
- שנו את ה-Content-Type ל-
application/json - שלחו את ה-payload הבא:
- אם לא עובד, נסו וריאציות:
{"$gt": ""}{"$regex": ".*"}{"$exists": true}- התחברו כ-admin והשלימו את המעבדה
תרגיל 2 - חילוץ נתונים עם $regex¶
PortSwigger Lab: Exploiting NoSQL injection to extract data
משימות¶
- מצאו נקודת הזרקה באפליקציה
- אשרו שניתן להשתמש ב-
$regex:
- כתבו סקריפט Python שמחלץ את הסיסמה תו אחר תו:
import requests
import string
url = "http://TARGET/login"
charset = string.ascii_lowercase + string.digits
password = ""
# השלימו את הסקריפט
- חלצו את הסיסמה המלאה
- התחברו עם הסיסמה שחילצתם
תרגיל 3 - הזרקת אופרטורים דרך Query Parameters¶
משימות¶
- הקימו סביבת Node.js מקומית עם Express ו-MongoDB
- צרו endpoint פגיע:
app.get('/users', async (req, res) => {
const users = await User.find({
role: req.query.role
});
res.json(users);
});
- נסו להזריק אופרטורים דרך URL:
- תעדו אילו אופרטורים עובדים ומה התוצאות
תרגיל 4 - הזרקת $where¶
משימות¶
- בסביבה המקומית, צרו endpoint שמשתמש ב-
$where:
app.get('/search', async (req, res) => {
const results = await Product.find({
$where: `this.name.includes('${req.query.q}')`
});
res.json(results);
});
- נסו לשבור את הלוגיקה:
- נסו לחלץ נתונים ממסד הנתונים דרך $where
- נסו מתקפת זמן (timing) לחילוץ עיוור
תרגיל 5 - NoSQL Injection ב-Python/Flask¶
משימות¶
- בהינתן הקוד הבא:
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)
- מצאו את כל נקודות ההזרקה
- כתבו payloads לכל אחת מהן
- הציעו תיקון לכל נקודה
תרגיל 6 - כל מעבדות PortSwigger¶
השלימו את כל המעבדות של PortSwigger בנושא NoSQL Injection:
- Detecting NoSQL injection (Apprentice)
- Exploiting NoSQL operator injection to bypass authentication (Practitioner)
- Exploiting NoSQL injection to extract data (Practitioner)
- Exploiting NoSQL operator injection to extract unknown fields (Practitioner)
לכל מעבדה תעדו¶
- את נקודת ההזרקה
- את ה-payload שהשתמשתם בו
- את התוצאה שהשגתם
- איך הייתם מגנים על הקוד
תרגיל 7 - כתיבת כלי סריקה¶
משימות¶
כתבו כלי Python שמבצע את הפעולות הבאות:
- בודק האם פרמטר פגיע ל-NoSQL Injection
- מנסה עקיפת אותנטיקציה עם אופרטורים שונים
- מחלץ נתונים עם
$regexאוטומטית - תומך גם ב-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)
משימות¶
- עקפו את האותנטיקציה והתחברו כ-admin
- השתמשו ב-endpoint של המשתמשים כדי לגלות את כל המשתמשים
- חלצו את סיסמת ה-admin תו אחר תו עם
$regex - מצאו דרך לחלץ נתונים רגישים מה-endpoint של המוצרים
- כתבו writeup מלא עם כל הצעדים