![]() |
|
|
#1 (permalink) |
Konuyu ilk olarak SQL in ne olduğunu açıklamakla başlayabiliriz
SQL Nedir? SQL (Structured Query Language) veritabanında data çekme, silme ve değiştirme gibi işlemler için kullanılan basit yapılı bir dildir. Hemen hemen tüm web altyapısında veritabanı desteği vardır ve bu web veritabanı ile SQL aracılığıyla anlaşırlar. Siteye mesaj yazdığınızda bu mesaj veritabanına kaydedilir. Mesaj onaylandığında veritabanındaki bir alan güncellenmiş olur. Yönetici veritabanındaki kaydı silerek mesajın siteden silinmesini sağlar. Örnek bir kayıt silme SQL cümlesi şu şekilde olabilir; DELETE FROM members WHERE id=17 Bu kod veritabanı tarafından çalıştırıldığında members tablosunda id alanı 17 olan kayıt silinecektir. Web uygulamalarında bir çok işlem için kullanıcıdan alınan veri ile dinamik SQLSELECT * FROM Products” örnek SQLSQL cümlecikleri oluşturulurken araya sıkıştırılan herhangi bir meta-karakter SQL Injection’ a neden olabilir. cümlecikleri oluşturulur. Mesela “ cümleciği basit şekilde veritabanından web uygulamasına tüm ürünleri döndürecektir. Meta-karakter bir program için özel anlamı olan karakterlere verilen isimdir. Örnek olarak C temelli C#, Javascript, PHP gibi dillerde (\) backslash karakteri bir meta-karakterdir. Compiler (derleyici) bu karakteri görünce ondan sonraki karakteri ona göre işler. SQL’ için kritik metakarakter (‘) tek tırnak’ tır. Çünkü iki tek tırnağın arası string olarak algılanır. Diğer bir önemli meta-karakter ise ( ; ) noktalı virgüldür, satırın bittiğini ve yeni satır başladığını bildirir. Genel bir web uygulamasında olası bir üye girişi işlemi şu şekildedir; Formdan gelen kullanıcı adı ve şifre bilgisi ile ilgili SQL cümleciği oluşturulur (SELECT * FROM members WHERE user=’admin’ AND password=’sifre’ gibi) SQL cümleciği kayıt döndürüyorsa böyle bir kullanıcının var olduğu anlamına gelir ve oturum açılır ve ilgili kullanıcı üye girişi yapmış olur. Eğer veritabanından kayıt dönmediyse "kullanıcı bulunamadı" veya "şifre yanlış" gibi bir hata ile ziyaretçi tekrar üye girişi formuna gönderilir. Şimdi klasik bir örnekle nasıl sql injection nasıl gerçekleşir onu anlatacağım : ASP ile yazılmış örnek bir üye girişi kodu; <% 1. FUsername = Request.Form("username") 2. FPassword = Request.Form("password") 3. 4. Set RsLogin = SQLConn.Execute("SELECT * FROM Members WHERE username = '" & FUsername & "' AND Password = '" & FPassword & "'") 5. 6. If RsLogin.EOF AND RsLogin.BOF Then 7. Response.Redirect "/error.asp" 8. 9. Else 10. Session("login") = RsLogin("user_id") 11. Response.Redirect "../" 12. 13. End If %> Kod 1. ve 2. satırda “username” ve “password” form değişkenlerinin değerlerini alıyor. 4. satırda SQL cümlesinin içerisine yerleştirip kullanıcı kontrolü yapıyor. Bundan sonra 6. satırda sonucun boş olup olmadığına bakıyor. Boş ise yani kullanıcı veritabanında bulunmadıysa 7. satırda görüldüğü gibi kullanının karşısına hata sayfasını çıkarıyor. Eğer bulunduysa 10 ve 11. satırdaki işlemleri yapıyor. Yani kullanıcıya id’ si ile birlikte bir session ( oturum ) açıyor. Bu sayede kullanıcı sisteme giriş yapmış oluyor. Bu klasik login prosedürüdür. Daha farklı şekilleri de mevcuttur. Kullanıcı adı ve şifreye bir injection denemesi yapıp neler olacağını inceleyelim. Eğer kullanıcı adı ve şifre yerine “' OR ''='” ve “' OR ''='” girersek başarılı bir şekilde üye giriş yapmış oluyoruz ama nasıl mı? Şimdi çalışan örnek kodu tekrar hatırlayalım 1 ve 2. satır form değerini alıyordu 4. satırda bu gelen değerleri SQL’ in içerisine yerleştirip veritabanında sorgu yaptırtıyordu. Değerleri yerlerine yerleştirip ve az önceki çalışan SQL’ e bakalım; SELECT * FROM Members WHERE username = '' OR ''='' AND Password = '' OR ''='' Farkettiğiniz üzere bu SQL sorgusu her zaman doğru dönecek ve “Members” tablosundaki tüm üyeleri getirecektir. Bu SQL cümleciğini tercüme edersek şu şekilde olacaktır. Members tablosundan username boş olanları ve password ü boş olanları getir ya da boş eşittir boş! Birinci ve ikinci mantıksal kontrolün kayıt döndürüp döndürmesi önemli değil çünkü üçüncü kontrol her zaman doğru olarak döneceğinden (boş her zamana boşa eşit ) bu SQL cümleciği her zaman tüm kayıtları döndürecektir. Yani kayıt boş mu dolu mu diye kontrol ettiğimizde kayıt dolu olarak gözükecektir. OR kullandık dolayıyla sorguların herhangi biri doğru (true) olarak dönerse tüm kayıtlar dönmüş oluyor. Bu SQL Injection' ı yaptığımızda dönen kayıtlardaki ilk kullanıcı olarak giriş yapılmış olacaktır. İlk kullanıcı da genelde admindir. Yani siteye admin girişi apmış olursunuz. SQLInjection; SQL cümleciklerinin arasına dışarıdan girdi yaparak SQL’ i istediğiniz şekilde manipüle etmenize izin veriyor. SQL Injection veritabanından ve dilden bağımsız olarak her türlü uygulama-veritabanı ilişkisine sahip sistemde bulunabilir ve bu veritabanlarının bir açığı değildir. SQL Injection’ dan korunmak web geliştiricilerine kalmıştır. _______________________ |
|
|
|
|
![]() |
| Sosyal Paylaşım Kısayolları |
| Etiketler |
| güvenlik, injection, kod, nedir, sql |
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Seçenekler | |
| ------------------------------------------------------------- | |
| Stil | |
|
|
Benzer Konular
|
||||
| Konu | Konuyu Başlatan | Forum | Cevaplar | Son Mesaj |
| SQL Server Yedekleme (Backup) İşlemi | RapeLLa | Webmaster & Programlama | 2 | 22/08/08 15:33 PM |
| SQL Server'da Veritabanı Fonksiyonları | DangerouS_GirL | Webmaster & Programlama | 0 | 14/04/08 12:51 PM |
| SQL dılını kullanarak | RapeLLa | Webmaster & Programlama | 0 | 12/03/07 23:33 PM |
| Aktiviteleri İzlemek - | RapeLLa | Webmaster & Programlama | 1 | 12/03/07 23:28 PM |
| SQL Server Hakkında genel Bilgiler | RapeLLa | Webmaster & Programlama | 14 | 12/03/07 17:46 PM |