~/sibercrew
Web Güvenliği

Enjeksiyon (Injection) Saldırıları Nedir?

SQL Injection dahil, en eski ve hâlâ en yaygın web zafiyet ailelerinden biri.

Enjeksiyon, güvenilmeyen verinin bir yorumlayıcıya (veritabanı, işletim sistemi kabuğu, LDAP vb.) komutun veya sorgunun bir parçası olarak gönderilmesi sonucu oluşan zafiyet ailesidir. En bilinen türü SQL Injection'dır.

Nasıl Çalışır?

Bir giriş formunun arkasındaki sorgu şu şekilde kurulmuş olsun:

sql
SELECT * FROM kullanicilar WHERE eposta = '{giris}' AND sifre = '{sifre}'

Saldırgan eposta alanına şunu yazarsa: admin@site.com' -- Sorgu şuna dönüşür ve şifre kontrolü devre dışı kalır:

sql
SELECT * FROM kullanicilar WHERE eposta = 'admin@site.com' --' AND sifre = '...'

Kod Örneği

Zafiyetli:

javascript
const query = `SELECT * FROM kullanicilar WHERE eposta = '${email}'`;
db.query(query);

Güvenli hâli:

javascript
const query = `SELECT * FROM kullanicilar WHERE eposta = $1`;
db.query(query, [email]);

Pratik Senaryo

Küçük bir işletme, müşterilerinin ürün arayabileceği bir arama kutusu ekliyor. Geliştirici, hızlı olsun diye arama sorgusunu doğrudan kullanıcı girişiyle birleştiriyor: SELECT * FROM urunler WHERE ad LIKE '%{arama}%'. Bir ziyaretçi arama kutusuna normal bir ürün adı yerine özel karakterler içeren bir metin yazıyor ve sorgunun yapısını bozarak veritabanındaki tüm kullanıcı tablosunun listelenmesini sağlıyor. İşletme bunu ancak sunucu loglarında normalden çok daha uzun ve tuhaf görünen bir arama sorgusu fark edildiğinde anlıyor. Bu senaryo, "sadece bir arama kutusu" gibi masum görünen alanların bile enjeksiyon riski taşıyabileceğini gösteriyor.

Gerçek Dünya Vakası

2017'deki büyük bir kredi kuruluşu veri ihlalinde kök neden aslında bir web framework'ündeki bilinen bir enjeksiyon/uzaktan kod çalıştırma açığının zamanında yamalanmamasıydı; bu da 140 milyondan fazla kişinin kişisel verisinin sızmasına yol açtı.

Tespit Yöntemleri

  • Dinamik test araçlarıyla (yalnızca izin verilen test ortamlarında) form alanlarına özel karakterler göndererek davranış farkını gözlemlemek.
  • Statik kod analizinde string birleştirmeyle oluşturulan sorguları otomatik taramak.
  • WAF loglarında enjeksiyon paternlerini izlemek.

Nasıl Önlenir?

  • Parametreli sorgular (prepared statements) kullanmak, string birleştirme yerine, her zaman.
  • ORM araçlarını doğru ve güncel kullanmak.
  • Giriş doğrulama yaparak beklenmeyen karakterleri/formatları reddetmek.
  • En az yetki ilkesiyle veritabanı kullanıcı hesabı tanımlamak.

Bu makale OWASP Top 10 2021 "A03:2021 – Injection" kategorisinin genişletilmiş Türkçe özetidir.

Kaynak: https://owasp.org/Top10/2021/A03_2021-Injection/ · Lisans: CC BY-SA 4.0