Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

Insecure Direct Object References (IDOR) Saldırılarını Önleme

Merhaba değerli okuyucular! Bugün, web uygulamalarında sıkça karşılaşılan ve ciddi güvenlik açıklarına yol açabilen Insecure Direct Object References (IDOR) saldırılarını ve bunları nasıl önleyebileceğimizi derinlemesine inceleyeceğiz. IDOR'un ne olduğunu, nasıl tespit edileceğini ve etkili önleme yöntemlerini ele alacağız. Hazırsanız, IDOR güvenliğinin derinliklerine dalalım!

IDOR Nedir?

IDOR, bir kullanıcının, erişim yetkisi olmayan nesnelere doğrudan erişebilmesine olanak tanıyan bir güvenlik açığıdır. Bu, genellikle kullanıcı girdisinin yetersiz doğrulanması sonucu ortaya çıkar.

IDOR Örneği:


// Güvensiz kod örneği
app.get('/api/users/:id', (req, res) => {
    const userId = req.params.id;
    const user = db.getUser(userId);
    res.json(user);
});

Bu örnekte, bir kullanıcı kendi ID'si dışındaki ID'leri deneyerek başka kullanıcıların bilgilerine erişebilir.

IDOR Saldırılarını Tespit Etme

  1. Endpoint'leri ve parametreleri analiz edin
  2. Farklı kullanıcı hesaplarıyla test yapın
  3. ID manipülasyonu deneyin
  4. Otomatik tarama araçları kullanın

IDOR Saldırılarını Önleme Yöntemleri

1. Yetkilendirme Kontrolleri

Her istek için kullanıcının yetkisini kontrol edin:


function isAuthorized(userId, resourceId) {
    // Kullanıcının bu kaynağa erişim yetkisi var mı kontrol et
    // Örneğin: Kullanıcının kendi profili mi, yönetici mi, vb.
    return userHasPermission(userId, resourceId);
}

app.get('/api/users/:id', (req, res) => {
    const requestedUserId = req.params.id;
    const currentUserId = req.user.id; // Oturum açmış kullanıcının ID'si

    if (!isAuthorized(currentUserId, requestedUserId)) {
        return res.status(403).json({ error: 'Yetkisiz erişim' });
    }

    const user = db.getUser(requestedUserId);
    res.json(user);
});

2. Dolaylı Nesne Referansları Kullanın

Doğrudan ID'ler yerine, geçici ve kullanıcıya özel referanslar kullanın:


const uuidv4 = require('uuid').v4;
const referenceMap = new Map();

function createReference(userId, resourceId) {
    const reference = uuidv4();
    referenceMap.set(reference, { userId, resourceId });
    return reference;
}

function resolveReference(reference, currentUserId) {
    const resource = referenceMap.get(reference);
    if (!resource || resource.userId !== currentUserId) {
        return null;
    }
    return resource.resourceId;
}

app.get('/api/resource/:reference', (req, res) => {
    const currentUserId = req.user.id;
    const resourceId = resolveReference(req.params.reference, currentUserId);

    if (!resourceId) {
        return res.status(404).json({ error: 'Kaynak bulunamadı' });
    }

    const resource = db.getResource(resourceId);
    res.json(resource);
});

3. Rol Tabanlı Erişim Kontrolü (RBAC)

Kullanıcı rollerine dayalı erişim kontrolleri uygulayın:


const ROLES = {
    USER: 'user',
    ADMIN: 'admin'
};

function checkRole(requiredRole) {
    return (req, res, next) => {
        if (req.user.role !== requiredRole) {
            return res.status(403).json({ error: 'Yetkisiz erişim' });
        }
        next();
    };
}

app.get('/api/users', checkRole(ROLES.ADMIN), (req, res) => {
    const users = db.getAllUsers();
    res.json(users);
});

4. Veri Filtreleme

Kullanıcıya döndürülen verileri filtreleyerek hassas bilgileri koruyun:


function filterUserData(user, requestingUserId) {
    if (user.id !== requestingUserId && !isAdmin(requestingUserId)) {
        return {
            id: user.id,
            name: user.name,
            // Hassas bilgileri çıkar
        };
    }
    return user;
}

app.get('/api/users/:id', (req, res) => {
    const requestedUserId = req.params.id;
    const currentUserId = req.user.id;

    const user = db.getUser(requestedUserId);
    const filteredUser = filterUserData(user, currentUserId);
    res.json(filteredUser);
});

5. Rate Limiting

Otomatize IDOR saldırılarını engellemek için rate limiting uygulayın:


const rateLimit = require("express-rate-limit");

const apiLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 dakika
    max: 100 // Her IP için 15 dakikada maksimum 100 istek
});

app.use("/api/", apiLimiter);

6. Parametre Şifreleme

Hassas parametreleri şifreleyerek tahmin edilmesini zorlaştırın:


const crypto = require('crypto');

function encryptParameter(param, secret) {
    const iv = crypto.randomBytes(16);
    const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(secret), iv);
    let encrypted = cipher.update(param);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return iv.toString('hex') + ':' + encrypted.toString('hex');
}

function decryptParameter(encryptedParam, secret) {
    const parts = encryptedParam.split(':');
    const iv = Buffer.from(parts.shift(), 'hex');
    const encryptedText = Buffer.from(parts.join(':'), 'hex');
    const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(secret), iv);
    let decrypted = decipher.update(encryptedText);
    decrypted = Buffer.concat([decrypted, decipher.final()]);
    return decrypted.toString();
}

app.get('/api/resource/:encryptedId', (req, res) => {
    const secret = process.env.ENCRYPTION_SECRET;
    const decryptedId = decryptParameter(req.params.encryptedId, secret);
    // İşleme devam et...
});

IDOR Güvenlik Kontrol Listesi

IDOR saldırılarına karşı uygulamanızın güvenliğini sağlamak için bu kontrol listesini kullanabilirsiniz:


class IDORSecurityChecker {
    constructor() {
        this.checks = {
            authorizationCheck: false,
            indirectReferences: false,
            rbacImplemented: false,
            dataFiltering: false,
            rateLimitingApplied: false,
            parameterEncryption: false
        };
    }

    implementAuthorizationCheck() {
        // Yetkilendirme kontrol mantığı
        this.checks.authorizationCheck = true;
    }

    useIndirectReferences() {
        // Dolaylı referans kullanım mantığı
        this.checks.indirectReferences = true;
    }

    implementRBAC() {
        // RBAC uygulama mantığı
        this.checks.rbacImplemented = true;
    }

    applyDataFiltering() {
        // Veri filtreleme mantığı
        this.checks.dataFiltering = true;
    }

    applyRateLimiting() {
        // Rate limiting uygulama mantığı
        this.checks.rateLimitingApplied = true;
    }

    useParameterEncryption() {
        // Parametre şifreleme mantığı
        this.checks.parameterEncryption = true;
    }

    isSecure() {
        return Object.values(this.checks).every(check => check === true);
    }

    generateReport() {
        console.log("IDOR Güvenlik Raporu:");
        for (const [check, implemented] of Object.entries(this.checks)) {
            console.log(`${check}: ${implemented ? 'Uygulandı' : 'Uygulanmadı'}`);
        }
        console.log(`Genel Güvenlik Durumu: ${this.isSecure() ? 'Güvenli' : 'İyileştirme Gerekiyor'}`);
    }
}

// Kullanım örneği
const idorChecker = new IDORSecurityChecker();
idorChecker.implementAuthorizationCheck();
idorChecker.useIndirectReferences();
idorChecker.implementRBAC();
idorChecker.applyDataFiltering();
idorChecker.applyRateLimiting();
idorChecker.useParameterEncryption();
idorChecker.generateReport();

IDOR saldırıları, web uygulamaları için ciddi bir güvenlik tehdidi oluşturur. Ancak, doğru önlemler alındığında bu tür saldırıları etkili bir şekilde önlemek mümkündür. Yetkilendirme kontrolleri, dolaylı nesne referansları, rol tabanlı erişim kontrolü, veri filtreleme, rate limiting ve parametre şifreleme gibi teknikleri bir arada kullanarak, uygulamanızı IDOR saldırılarına karşı güçlü bir şekilde koruyabilirsiniz.

Unutmayın ki, güvenlik sürekli bir süreçtir. Uygulamanızı düzenli olarak güvenlik açıklarına karşı test edin, güncel güvenlik pratiklerini takip edin ve yeni ortaya çıkan tehditlere karşı hazırlıklı olun.

Siz IDOR saldırılarına karşı hangi önlemleri alıyorsunuz? Uygulamalarınızda karşılaştığınız zorluklar neler? Deneyimlerinizi ve düşüncelerinizi yorumlarda paylaşın!

Güvenli kodlamalar ve IDOR'suz bir dünya dilerim!