Merhabalar, size yardımcı olmak için şu önerilerimi lütfen dikkate alın.
İlk önce incelediğim birçok Türk arkadaşımızın PHP ile kodladığı uygulamalara bakınca şu kanıya ulaştım:
1- SQL injection kritik bir açıktır. Yetkisiz bir şekilde veritabanınızda SQL sorguları çalıştırılabilir.
Yapılabilecek birkaç örnek:
Yetkili kullanıcı için gerekli oturum bilgilerine ulaşmak
Sistemden dosya okumak, yazmak veya içeriğini değiştirmek. - Gerekli izinler veritabanı kullanıcısına atanmışsa -
Korunmanın en pratik çözümü: Projenizi komple PDO ile geliştirmeniz ve girdi noktalarını (GET, POST, COOKIE, REQUEST, HTTP başlıkları bazen -xforwardedfor- gibisinden) filtrelemeye uğratmanız örneğin bir array içerisine almanız gibisinden.
Eğer proje komple PDO içerisine geçirilmeyecekse yapılacak çözüm ve veritabanı yazılımı MySQL ise: Mysql_real_escape_string ve addslashes gibisinden fonksiyonlar kullanmak. Ancak bu fonksiyonlar alınan verideki tek tırnak gibi özel karakterleri filtreler eğer siz SQL sorgunuzda zaten tek tırnak kullanmadıysanız yine atlatılabilir. MySQL eski sürümlerinde bir karakter seti sebebiyle oluşan bug yüzünden mysql_real_escape_string gibi güvenlik önlemleri atlatılabiliyordu -2011 civarı- Ancak bug güncel MySQL sürümlerinde geçersizdir. Yine de mysql_real_escape_string fonksiyonunu kullanacaksanız eski bir MySQL sürümünü kullanmadığınıza emin olun.
2- Dosya yükleme açığı. Yetkisiz bir şekilde sisteme dosya yükleyebilir. Ve en basitinden eğer zararlı dosya yüklerse sistemde izinsiz komut çalıştırabilir.
Sık sık insan kaynakları bölümünde görüyorum. CV alınırken güvenlik önlemi alınmadığından sisteme zararlı dosya yüklenebiliyor.
Bazen yetkili kullanıcı sayfasından dosya yükleme açığı oluyor. Evet normalde dışarıdan bir saldırgan sizin dosyayı nereye yüklediğinizi ve hangi girdilerle yükleneceğini bilmediğinden saldıramaz. Ama kullandığınız yazılım özel bir yazılım değilse başkası tarafından indirilip kodları incelendiğinde açık tespit edilecektir. Ve sonrası sadece o yazılımın kullanan web sitelerini bulmak ve saldırmak. Bu kadar basit.
Kimse uğraşmaz demeyin. Her gün yazılımlarda yeni açıklıklar tespit ediliyor ve zamanla bu açıklıklar herkesle paylaşılıyor. (Bknz. Exploit-DB)
Korunmanın pratik çözümü: Dosya uzantısını beyaz listeyle filtrelemek. Bakın dosya tipi mime tipinden olur içerik analizinden olur manipüle edilip atlatılabilir ancak dosya uzantısı değişmezdir. Eğer gelen dosya ismini basitçe . ile ayırırsanız ve en sondaki yazıyı yani uzantıyı alırsanız ve sizin asıl beklediğiniz veri türünün uzantısı mı diye kontrol et derseniz öyleyse yükleyebilirsiniz öyle değilse kötü niyetli bir saldırı olabilir. Beyaz liste dediğimiz dosya uzantıları sizin beklediğiniz uzantılara sahip dosyalardır. Örneğin normalde fotoğraf ya da resim dosyası bekliyorsanız .jpg .jpeg .png .gif vb.
Bir de class.upload.php ile türeterek dosya almakta güvenli değil geçtiğimiz birkaç yıl içerisinde bu sınıfın güvenlik önlemleri atlatılabilmişti. (Bknz. CVE-2019-19634)
3- Yetkili Kullanıcı Paneline Yetkisiz Erişim: Web sitenizde yetkili kullanıcı için ayrılan sayfası atlatılabilir.
Örneğin siz yetkili kullanıcı için admin dizini oluşturdunuz ve admin dizinine gidenler ilk başta admin/giris.php sayfasına yönlendiriliyor. Ama asıl anasayfa.php dosyası hala dışarıdan erişilebilir ise.
Deneme yanılma yoluyla admin/anasayfa.php dosyasına ulaşılabilir bunun için özel deneme yanılma saldırısı yapacak yazılımlar bile var (Bknz. gobuster).
Korunmak için çözüm: Eğer yetkili kullanıcı girişi doğru olduysa basitçe Session oluşturabilir yani örneğin session üzerinde yetkili değeri 1 gibisinden ve bu sayede anasayfa.php dosyasına ulaşmaya çalışan kişilerin session değeri kontrol edilip ilgili session'a sahipse göster denilip sahip değilse die kodu ile dosyayı sonlandırabiliriz. Dikkat dosyayı sonlandırmak yerine header ile giris.php yönlendirirsek sadece header ile yönlendirmiş oluyoruz basit bir http isteğiyle yine anasayfa.php içeriğin görüntülenecektir. Örneğin curl gibi yazılımlarla anasayfa.php içeriği okunabilir. Eğer hem giris.php yönlensin hem de anasayfa.php içeriği görükmesin istiyorsak mesela header'dan sonra bir exit ile dosyayı sonlandırabiliriz.
Tabi bunu tüm dosyalarda yapmak mantıklı olacaktır yoksa başka dosyalar içeriği yine okunabilir duruma göre yeni içerikler oluşturulabilir eğer hızlı bir çözüm arıyorsak admin dizinindeki header için ayrılan dosyaya direkt olarak session sorgusu yaptırtılıp ve ilgili session üzerindeki değer yoksa giris.php yönlendir ve exit yapılabilir. Ve header.php her sayfanın en üst satırında içeri dahil edilmesiyle daha pratik bir çözüm sağlamış oluruz.
4- Yetkili kullanıcının yapabileceği işlemlerine yetkisiz İŞLEMLER.
Tamam önceki örnekte anlattığım gibi güvenlik önlemleri aldık. Artık dosyalara erişemiyoruz dışarıdan. Ancak eğer yetkili kullanıcının tüm dosyalarına bunu yapmadıysak örneğin yetkili kullanıcı için oluşturulan ajax.php ya da fonksiyonlar.php gibisinden dosyalar. Eğer kullandığımı yazılım bize özel değilse kaynak kodlarını araştıran herhangi biri açık tespit edebilir -SQL injection, Dosya yükleme zafiyeti vb.- ve bu açığı istismar edebilir. Ve bunu canlı sistemler üzerinde de gerçekleştirebilir. Kullandığımız yazılım bize özel olsa bile eğer saldırgan tarafın potansiyel gücünü bilemiyorsak yine açık bulunabilir.
Korunmak için çözüm: Giriş sayfasında tek atanılabilen ve giriş başarılıysa session üzerinde bulunan yetkili anahtar değerindeki veri 1 gibisinden bir önlem yoksa yine bu dosyaya erişilebilir.
Bunlar benim rastladığım en kritik ve yaygın olan açıklardır. Tabi özellikle yetkili kullanıcı sayfasında SQL injection olmaması ve admin admin gibi basit oturum bilgileri olmamasını umarak söylüyorum.
Sevgi ve saygıyla.
Hocam çok teşekkür ediyorum, şimdi yatıyordum, yarın detaylı olarak okuyacağım yazınızı.