Sehitler Ölmez PHP Uygulamalarında SQL Injection Saldırıları
hack, Program, Oyun, Ceptelefonu, Ogame, crack, serial, donanım
Ekim 07, 2008, 02:48:54 ÖÖ *
Program, Oyun, Crack, Serial, Msn Hack, Hacking ve güvenlik portalına hoşgeldiniz.. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz
Duyurular: Şehitlerimizin Ruhu Şad Olsun !

 


Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: PHP Uygulamalarında SQL Injection Saldırıları  (Okunma Sayısı 487 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
kopil_1923
Ziyaretçi
« : Şubat 21, 2008, 10:09:30 ÖS »

döküman listelerimden SQL saldırıları

Veritabanı kullanılan uygulamalarda en büyük güvenlik sorunlarından biri SQL Injection saldırılarıdır. Bu tip saldırılar genellikle, kullanıcıdan gelen verinin filtrelenmeden veya tipinin doğruluğu kontrol edilmeden sorguya sokulması sonucu oluşur.

SQL Injection saldırılarını önlemek kolaydır, ama tespit etmek her programcı için kolay değildir.Şimdi perdenin arkasını açalım ve PHP& MySQL uygulamarında ne tür ataklar olabileceğini, nasıl önlem alabileceğimizi görelim...

Bir üyelik sistemi ve login sayfası düşünün, bu sayfada muhtemelen aşağıdaki gibi bir sorgu olacak.



SELECT uye, parola FROM uye where uye= 'ş_POST[uye]' and parola='ş_POST[parola]'



Sistem işleyişi normal gibi görünüyor ama saldırganın tekinin kullanıcı adına ?uye=admin'/* girdiğini hayal edin.Sorgu şu hali alacak.



SELECT uye,parola FROM uye WHERE uye='admin'/* AND parola=''



/* karakteri mysql veritabanında yorum satırı başlangıcını ifade eder, dolayısıyla asıl sorgu, SELECT uye_parola FROM uye WHERE uye='admin' haline gelecektir.

Bu tür bir saldırıyı zararlı karakterleri escape(\) ederek durdurabilirsiniz.Bu işi PHP'de yapan hazır fonksiyonlar mevcut, örneğin addslashes(), ve mysql_real_escape_string().PHP manual'den bu fonksiyonların kullanımlarıyla ayrıntılı bilgi alabilirsiniz.

SQL Injection konusunda genelde dikkat edilmeyen bir diğer konu da kullanıcının normalde göndermesi gereken integer değerlerin (genelde ID) integer olup olmadığının kontrol edilmemesidir.

Herhangi üyenin detaylarını gösteren bir sayfa düşünün;



x.php?uyeid=1 (Bu adres 1 no'lu uyenin bilgilerini gostersin)





şid = mysql_real_escape_string(şid);


şsorgu = "SELECT isim,soyad,bla,bla FROM uyeler WHERE id = ş_GET[id]";



Eminim birçoğunuz zaten yukarıdaki kodun yeterince güvenli olduğunu düşünüyorsunuz fakat değil.Mysql 4.x ile birlikte mySQL union select destegi vermeye başladı.

Saldırganın tekinin ?id=-1 UNION SELECT 0,uye,parola FROM uye olarak istek yaptığını düşünsenize.. Birinci - asıl - select sorgusu herhangi bir sonuç döndürmeyeceği için dönen sonuclar saldırganın girdigi union select içindeki alanlar olacaktır.

Dikkatinizi çektiyse tırnak kullanmadan böyle bir saldırı yapılabiliyor, dolayısıyla bu nokta dikkat edilmesi gereken bu tip id tarzı bilgileri sorguya alırken veri tipini kontrol etmek.

Bunu (int)şdegisken veya intval(şdegisken); seklinde yapabilirsiniz.Ya da is_integer, is_numeric gibi fonksiyonlarla kontrol edip gerekli manual try/catch mekanizmasını kurabilirsiniz.

Ya da bu tür değerleri tırnak içine alarak saldırganın işi zorlaştırılabilir.



(where id = 'şid' gibi)


Zira, bu durumda saldırgan union select sorguları sokabilmek için ilk önce ilk SELECT sorgusunu bitirmek zorunda kalacak ve UNION SELECT yazmadan önce ' karakterini yazacak.Fakat mysql_real_escape_string burda devreye girip ' karakterini escape edeceği için olası saldırılar geçersiz hale gelir.

Yani daha güvenli bir kod aşağıdaki gibi olacak;



şid = intval(ş_GET["id"]);


şsorgu = "SELECT * FROM uyeler WHERE id = 'şid' ";



SQL injection saldırıları bunlarla sınırlı değil, mysql'nin desteklediği INTO OUTFİLE ile SQL dumplarınız çalınabilir veya uzaktan php kodları çalıştırabilinir, load_file() fonksiyonu ile dosyalarınızın, konfigurasyon dosyalarınızın kaynak kodları okunabilir..

Bir diğer nokta da ; tarzı sorgunun bitip yeni sorgunun başladığını belirten veritabanı işaretçileri.mysql_query() bu tip çoklu(multiple) sorguları desteklemediği için sorun yok, ama SQLite veya PortreSQL ile çalışıyorsanız ; karakterine dikkat etmeniz gerekiyor.Zira x.php?id=1;DROP DATABASE uye gibi bir sorgu yazmak zor değil.

Kısaca yapılabilecekler mySQL'nin yapılabilecekleri ile sınırlı.

PHP programcısının bu konuda yapması gerekenler:

- Kullanıcıdan gelen veriyi salt halde sorguya sokmamak, gerekli filtremeleri mysql_real_escape_string() tarzı fonksiyonlarla yapmak

- Sayısal değerleri tırnak içine almak

- Magic_quotes'a güvenmemek ( magic_quotes nasıl olsa escape ediyor, benim bir şey yapmama gerek yok düşüncesi )

- mysql_error() çıktısını sadece geliştirme sürecinde debugging amacıyla kullanmak, zira olası bir sql hatasında ekrana mysql_error() çıktısı verirseniz saldırganın işini kolaylaştırmış olursunuz.

Bunların dışında PHP 5 ile gelen prepared statementlar sayesinde SQL injection saldırılarından kesin olarak kurturabilirsiniz.Zira bu özellik sayesinde, gelen veriler otomatik olarak sürücü tarafından işleme alınıp zararlı karakter temizleniyor, hatta veri tipini belirttiğiniz sürece type-casting bile yapabilirsiniz.


saygılar...kolay gelsin...

Logged
Sayfa: [1]   Yukarı git
Yazdır
Gitmek istediğiniz yer:  


Powered by SMF 1.1.6 | SMF © 2006, Simple Machines LLC


Reklam vermek için sabotecom@windowslive.com adresine mail gönderiniz. Sabote.com bir forum sitesidir ve siteye gönderilen tüm mesajlar onaydan geçmeksizin anında paylaşılmaktadır. Sabote yönetimi yazılan mesajlardan sorumlu değildir, tüm sorumluluk mesajı yazan kişilere aittir. Yasalara aykırı bulduğunuz mesajları linkleriyle beraber sabotecom@windowslive.com adresine bildirebilirsiniz. Şikayetiniz en kısa sürede incelemeye alınacaktır.. For English: Please let us know any illegal activity to sabotecom@windowslive.com

2008© sabote.com
Bu Sayfa 0.054 Saniyede 17 Sorgu ile Oluşturuldu
popup Hosgeldiniz close
guest Hala Üye degilmisiniz?
Üye olmak çok kolay
Üye olmak için tiklayin