SQL Enjeksiyon Eğitimi: Örnekle Öğrenin

⚡ Akıllı Özet

SQL enjeksiyonu, kimlik doğrulamasını atlatmak veya verileri açığa çıkarmak için dinamik SQL ifadelerini zehirleyen ve temizlenmemiş kullanıcı girdilerinden sorgular oluşturan web uygulamalarını istismar eden bir saldırıdır. Bu sayfa, saldırının nasıl çalıştığını ve nasıl önleneceğini göstermektedir.

  • ???? Tanım: SQL enjeksiyonu, doğrulanmamış bir giriş alanı aracılığıyla sorguya kötü amaçlı SQL kodu ekler.
  • 🔓 Etki: Başarılı bir saldırı, oturum açma işlemlerini atlayarak kayıtları okuyabilir, değiştirebilir veya silebilir.
  • 🧪 Örnek: Her zaman doğru olan bir koşul ve bir yorum, giriş kontrolünü bir atlama yöntemine dönüştürür.
  • Araçlar: SQLMap ve jSQL, enjekte edilebilir parametrelerin tespitini ve istismarını otomatikleştirir.
  • 🛡️ önleme: Parametreli sorgular, girdi doğrulama ve en az ayrıcalıklı hesaplar bu açığı kapatıyor.
  • 🤖 Modern bir dokunuş: Yapay zekâ destekli tarayıcılar ve güvenlik duvarları, sabit imzaların gözden kaçırdığı enjeksiyon modellerini tespit eder.

SQL Enjeksiyonu Eğitimi

SQL Enjeksiyonu nedir?

SQL Enjeksiyonu, dinamik SQL ifadelerini zehirleyerek ifadenin belirli kısımlarını yorum satırı haline getiren veya her zaman doğru olacak bir koşul ekleyen bir saldırıdır. Kötü tasarlanmış web uygulamalarındaki tasarım kusurlarından yararlanarak SQL ifadelerini istismar eder ve kötü amaçlı SQL kodunu çalıştırır.

Veri, bilgi sistemlerinin en hayati bileşenlerinden biridir. Veritabanı tabanlı web uygulamaları, kuruluşlar tarafından müşterilerden veri almak için kullanılır. SQL, bunun kısaltmasıdır. Yapılandırılmış sorgu diliVeritabanındaki verileri almak ve işlemek için kullanılır.

SQL enjeksiyonunun dinamik bir veritabanı sorgusunu nasıl manipüle ettiğini gösteren şema.

SQL Enjeksiyon Saldırısı Nasıl Çalışır?

SQL enjeksiyonu kullanılarak gerçekleştirilebilecek saldırı türleri, veritabanı motorunun türüne bağlı olarak değişir. Saldırı, dinamik SQL ifadeleri üzerinde çalışır. Dinamik ifade, bir web formundan veya URI sorgu dizesinden geçirilen parametreler kullanılarak çalışma zamanında oluşturulan bir ifadedir.

SQL Enjeksiyon Örneği

Basit bir giriş formu içeren bir web uygulamasını ele alalım. HTML formunun kodu aşağıda gösterilmiştir.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

İŞTE,

  • Yukarıdaki form e-posta adresini ve şifreyi kabul eder ve ardından bunları bir sisteme gönderir. PHP index.php adlı dosya.
  • Oturum açma işlemini çerezde saklama seçeneği mevcuttur. Bunu "beni hatırla" onay kutusundan çıkardık. Verileri göndermek için POST yöntemini kullanır. Bu, değerlerin görüntülenmediği anlamına gelir. URL.

Kullanıcı kimliğini kontrol etmek için arka uçta kullanılan ifadenin aşağıdaki gibi olduğunu varsayalım.

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

İŞTE,

  • Yukarıdaki ifade, $_POST[] dizisinin değerlerini, bunları temizlemeden doğrudan kullanır.
  • Parola, MD5 algoritması kullanılarak şifrelenmiştir.

SQL enjeksiyon saldırısını şu yöntemle açıklayacağız: SQL Fiddle. Aç URL http://sqlfiddle.com/ web tarayıcınızda. Aşağıdaki pencereyi göreceksiniz.

Not: SQL sorgularını kendiniz yazmanız gerekecek.

boş SQL Fiddle Şema ve sorgu için pencere hazır.

) 1 Adım Bu kodu soldaki panele girin.

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

) 2 Adım Şema Oluştur'a tıklayın.

) 3 Adım Bu kodu sağdaki bölmeye girin.

select * from users;

) 4 Adım "SQL Çalıştır"a tıklayın. Aşağıdaki sonucu göreceksiniz.

SQL Fiddle Tek kullanıcı kaydının döndürüldüğü sonuç

Kullanıcının admin@admin.sys adresini ve 1234 şifresini verdiğini varsayalım. Veritabanına karşı yürütülecek sorgu şu şekilde olacaktır:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Yukarıdaki kod, parola kısmını yorum satırı haline getirip her zaman doğru olacak bir koşul ekleyerek istismar edilebilir. Saldırganın e-posta adresi alanına aşağıdaki girdiyi sağladığını varsayalım.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

Şifre için xxx.

Oluşturulan dinamik ifade aşağıdaki gibi olacaktır.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

İŞTE,

  • xxx@xxx.xxx Tek bir tırnak işaretiyle sona erer ve bu da tırnak işareti dizesini tamamlar.
  • OR 1 = 1 LIMIT 1 her zaman doğru olacak ve döndürülen sonuçları yalnızca bir kayıtla sınırlayacak bir durumdur.
  • — ' AND… şifre kısmını ortadan kaldıran bir SQL yorumudur.

Yukarıdaki SQL ifadesini kopyalayıp yapıştırın. SQL Fiddle Aşağıda gösterildiği gibi SQL metin kutusunu çalıştırın.

SQL Fiddle Enjekte edilen koşul çalıştıktan sonra kaydı döndürmek

Hacking Etkinliği: SQL Bir Web Uygulamasını Enjekte Etme

Basit bir web uygulamamız var http://www.techpanda.org/ Bu, yalnızca gösterim amacıyla SQL Enjeksiyon saldırılarına karşı savunmasızdır. Yukarıdaki HTML form kodu giriş sayfasından alınmıştır. Uygulama, e-posta alanını temizleme gibi temel güvenlik önlemleri sağlar. Bu, yukarıdaki kodumuzun giriş işlemini atlatmak için kullanılamayacağı anlamına gelir.

Bunu aşmak için, bunun yerine parola alanını kullanıyoruz. Aşağıdaki şema izlenecek adımları göstermektedir.

Giriş formu şifre alanına veri ekleme adımlarının akış diyagramı

Saldırganın aşağıdaki girdiyi sağladığını varsayalım.

  • Adım 1: E-posta adresi olarak xxx@xxx.xxx girin
  • Adım 2: xxx'i girin) VEYA 1 = 1 — ]

Şifre alanına enjeksiyon dizesinin girildiği giriş formu.

  • Gönder düğmesine tıklayın.
  • Gösterge paneline yönlendirileceksiniz.

Oluşturulan SQL sorgusu aşağıdaki gibi olacaktır.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Aşağıdaki diyagram, ifadenin nasıl oluşturulduğunu göstermektedir.

Enjekte edilen SQL sorgusunun nasıl oluşturulduğunun ayrıntılı açıklaması

İŞTE,

  • Bu ifade, akıllıca bir şekilde MD5 şifrelemesinin kullanıldığını varsaymaktadır.
  • Tek tırnak işaretini ve kapanış parantezini tamamlar.
  • İfadeye her zaman doğru olacak bir koşul ekler.

Genel olarak, başarılı bir saldırı yukarıda gösterilenler gibi çeşitli teknikleri bir araya getirir.

Diğer SQL Enjeksiyon Saldırısı Türleri

SQL enjeksiyon saldırıları, yalnızca oturum açma algoritmalarını atlatmaktan daha fazla zarar verebilir. Saldırıların bazı örnekleri şunlardır:

  • Veri silme
  • Verileri güncelleme
  • Veri ekleme
  • Truva atları gibi kötü amaçlı programları indirip yükleyebilecek sunucuda komutlar yürütmek
  • Kredi kartı bilgileri, e-posta ve parolalar gibi değerli verilerin saldırganın uzak sunucusuna aktarılması
  • Kullanıcı giriş bilgilerini alma, vb.
  • Çerezlere dayalı SQL enjeksiyonu
  • Hata Tabanlı SQL Enjeksiyonu
  • Kör SQL Enjeksiyonu

Yukarıdaki liste kapsamlı değildir; sadece SQL Injection'ın neler yapabileceğine dair bir fikir vermektedir.

SQL Enjeksiyonu için Otomasyon Araçları

Yukarıdaki örnekte, SQL konusundaki geniş bilgimize dayanarak manuel saldırı teknikleri kullandık. Saldırıları daha verimli ve mümkün olan en kısa sürede gerçekleştirmenize yardımcı olabilecek otomatik araçlar da mevcuttur. Bu araçlar şunlardır:

SQL Enjeksiyon Saldırılarını Nasıl Önleyebilirsiniz?

Bir kuruluş SQL Injection saldırılarına karşı kendini korumak için aşağıdaki politikayı benimseyebilir.

  • Kullanıcı girdilerine asla güvenilmemelidir. – Dinamik SQL ifadelerinde kullanılmadan önce her zaman temizlenmesi gerekir.
  • Saklı yordamlar – Bunlar SQL ifadelerini kapsayabilir ve tüm girdileri parametre olarak ele alabilir.
  • Hazırlanan ifadeler – Hazırlanmış sorgular, önce SQL sorgusunu oluşturarak, ardından gönderilen tüm kullanıcı verilerini parametre olarak ele alarak çalışır. Bu, SQL sorgusunun sözdizimini etkilemez.
  • Düzenli ifadeler – Bunlar, potansiyel olarak zararlı kodları tespit etmek ve SQL sorgularını çalıştırmadan önce kaldırmak için kullanılabilir.
  • Veritabanı bağlantısı kullanıcı erişim hakları – Yalnızca gerekli erişim hakları, kullanılan hesaplara verilmelidir. veritabanına bağlan. Bu, SQL ifadelerinin sunucuda gerçekleştirebileceklerinin azaltılmasına yardımcı olabilir.
  • Hata mesajları – Bu mesajlar hassas bilgileri veya hatanın tam olarak nerede meydana geldiğini ifşa etmemelidir. Hata veren SQL ifadelerini göstermek yerine, "Üzgünüz, teknik hatalar yaşıyoruz. Teknik ekiple iletişime geçildi. Lütfen daha sonra tekrar deneyin" gibi basit özel hata mesajları kullanılabilir.

Hacking Etkinliği: SQL Enjeksiyonu için Havij'i kullanın

Bu uygulamalı senaryoda, bir web sitesini güvenlik açıkları açısından taramak için Havij Advanced SQL Injection programını kullanıyoruz.

Not: Havij eski ve bakımı yapılmayan bir yapıdır. Windows Yukarıdaki SQLMap aracı, mevcut açık kaynak standardıdır.

Not: Antivirüs programınız, dosyanın niteliği nedeniyle onu zararlı olarak işaretleyebilir. Dosyayı dışlama listesine eklemeli veya virüs taramanızı durdurmalısınız. antivirüs programı.

Aşağıdaki resimde Havij'in ana penceresi gösterilmektedir.

Havij SQL enjeksiyon aracının ana penceresi

Yukarıdaki araç, bir web sitesinin veya uygulamanın güvenlik açıklarını değerlendirmek için kullanılabilir.

SSS

Yalnızca site sahibinin yazılı izniyle. Sahip olmadığınız bir uygulamayı test etmek, ABD Bilgisayar Dolandırıcılığı ve Kötüye Kullanım Yasası gibi yasalar uyarınca yasa dışıdır. Hata ödül programı kapsamları, nelerin izin verildiğini tanımlar.

Evet. OWASP Top 10:2025'te enjeksiyon saldırıları A05. sırada yer alıyor ve testler hala neredeyse her uygulamada enjeksiyon saldırılarına rastlıyor. Yılda binlerce yeni SQL enjeksiyonu CVE'si ile önde gelen web risklerinden biri olmaya devam ediyor.

MD5 hızlı bir karma algoritmasıdır, şifreleme algoritması değildir ve saldırganlar gökkuşağı tabloları ve GPU'lar kullanarak bunu hızla kırabilirler. Bunun yerine parolalar için bcrypt veya Argon2 gibi yavaş, tuzlama algoritmaları kullanın.

Dinamik olarak oluşturulmuş SQL aracılığıyla sorgulanan herhangi bir veritabanı — MySQL, PostgreSQL, Microsoft SQL Server, Oracle, ve SQLiteSorun, veritabanı motorunda değil, uygulamanın kullanıcı girdilerini sorgulara nasıl birleştirdiğinde yatıyor.

Yapay zekâ destekli güvenlik duvarları ve tarayıcılar normal trafik modellerini öğrenir, ardından enjekte edilen koşullar veya yorumlar gibi anormal girdileri gerçek zamanlı olarak işaretler. Makine öğrenimi modelleri, sabit imzaların gözden kaçırdığı gizlenmiş veri paketlerini yakalar.

Yapay zekâ asistanları gibi GitHub Yardımcı Pilotu Parametreli sorgular ve girdi doğrulaması önerebilirler, ancak aynı zamanda güvensiz kalıpları da yeniden üretirler. Her öneriyi bir taslak olarak değerlendirin ve bir güvenlik denetleyicisiyle eşleştirip gözden geçirin.

SQL enjeksiyonu, sunucu tarafındaki sorgulara SQL kodları enjekte ederek veritabanını hedef alır. Çapraz site komut dosyası çalıştırma (XSS) ise, diğer kullanıcıların tarayıcılarında çalışan komut dosyaları enjekte ederek onları hedef alır. Biri verileri açığa çıkarırken, diğeri oturumları ele geçirir.

Bir ORM (nesne-ilişkisel eşleyici), varsayılan olarak parametreleme ile kod nesnelerinden sorgular oluşturarak çoğu SQL enjeksiyonunu önler. Ancak tamamen kusursuz değildir; ham sorgular ve güvenli olmayan yöntemler hala sızıntıya neden olur, bu nedenle doğrulama hala önemlidir.

Bu yazıyı şu şekilde özetleyin: