PHP’nin en güçlü sunucu tarafı dili olduğu söyleniyor, PHP en iyi 10 milyon alan adı ile dünya çapındaki web’in %80’i tarafından kullanılıyor ve yine de PHP güvenli bir dil olarak kabul ediliyor. Bu nedenle PHP’nin doğru kullanımı web sitelerinizi ve verilerinizi saldırganlardan korumanıza yardımcı olacaktır.
PHP dünya çapında en yaygın kullanılan sunucu tarafı web programlama dilidir. Farklı PHP uygulamaları, kodlarının ve komut dosyalarının farklı bölümlerini diğer web uygulamalarıyla paylaşır. Paylaşılan kodun savunmasız olduğu tespit edilirse, bu paylaşılan kod parçasını kullanan tüm uygulamalar risk altındadır ve savunmasız olarak kabul edilir. PHP’nin bu özelliği dikkate alındığında PHP güvenliğinin iki kat önem kazandığı söylenebilir.
PHP güvenlik kontrolü
PHP herhangi bir ana sunucu tarafı dili kadar güvenlidir ve PHP’nin göreceli güvenliği konusunda hiç şüphe yoktur; Ancak bu, bu dilin güvenlik açısından zayıf bir noktası olmadığı anlamına gelmez. Dünyadaki hiçbir programlama dili %100 güvenli olduğunu iddia edemez ve bu PHP için de geçerlidir. Son birkaç yılda tanıtılan yeni PHP çerçeveleri ve araçlarıyla PHP güvenliğini yönetmek artık çok daha kolay.
Bir karşılaştırma yaparsak PHP diğer dillerden daha güvenli olmasa da daha kötü değildir. Java, JavaScript ve diğer dillerin tümü yıllar içinde güvenlik açıklarından nasibini aldı.
PHP güvenliği neden önemlidir?
Son araştırmalar, birçok PHP uygulamasının, kötü tasarım ve bir web uygulamasını güvence altına almak için gereken temel güvenlik uygulamalarının yeterince anlaşılmaması nedeniyle güvenlik açıklarına maruz kaldığını göstermektedir.
PHP, WordPress web sitenizi çalıştıran koddur. Web sitenize yüklenen eklentiler, temalar ve phpmyadmin gibi diğer programlar da PHP kodu içerir. Öte yandan çoğu içerik yönetim sistemi ve özel web sitesi PHP ile yazılmıştır ve bu anlamda PHP’nin güvenliği çok önemli hale gelmiştir.
PHP’deki güvenlik açığı türleri
PHP’deki güvenlik açıkları genellikle türlerine göre kategorize edilir. Aşağıda PHP kodundaki en yaygın güvenlik açıklarının bir listesi ve her birinin temel açıklaması bulunmaktadır.
Uzaktan kumanda veya RCE
Bir saldırganın web sitenize kod yükleyip çalıştırabilmesi durumunda uzaktan kontrol güvenlik açığı (RCE) meydana gelir. Bir PHP programındaki bir kusur, kullanıcı girdisini kabul edebilir ve bunu PHP kodu olarak yorumlayabilir. PHP’deki bu güvenlik ihlali, bir saldırganın bir web sitesine tam erişime izin verecek kod içeren yeni bir dosya oluşturmasını söylemesine olanak tanıyabilir.
Başka bir deyişle, bir saldırgan web uygulamanıza kod gönderdiğinde ve bu kod çalıştırılıp saldırganın erişimine izin verdiğinde, bir RCE güvenlik açığından yararlanmış demektir.
Bu güvenlik açığı oldukça ciddidir ve kolayca istismar edilebilir; saldırgana, istismarın hemen ardından tam erişim sağlar.
SQL Enjeksiyonu veya SQLi
SQL Enjeksiyonu, bir saldırganın veritabanınıza talimatlar göndermesi ve veritabanının bu talimatları yürütmesi durumunda gerçekleşir. PHP’de bir güvenlik ihlali olan bu güvenlik açığı, PHP geliştiricisinin bir web sitesi ziyaretçisinden girdi alıp, bu girdinin kötü amaçlı içerik içerip içermediğini kontrol etmeden bir veritabanına göndermesi sonucu ortaya çıkar.
SQL Enjeksiyonu, bir saldırganın web sitenizdeki tüm verilere erişmesini sağlayabilir. Ayrıca veritabanınızda kötü amaçlı web sitelerine veya spam’a bağlantılar içerebilecek yeni veriler de oluşturabilirler. Saldırgan ayrıca SQL Enjeksiyonu kullanarak yönetim düzeyinde yeni bir kullanıcı hesabı oluşturabilir ve bu hesabı daha sonra web sitenize giriş yapmak ve tam erişim elde etmek için kullanabilir. SQLi ciddi bir güvenlik açığıdır çünkü istismar edilmesi kolaydır ve bilgisayar korsanına anında tam erişim sağlar.
Siteler Arası Komut Dosyası Çalıştırma veya XSS
Siteler arası komut dosyası oluşturma (XSS), bir saldırganın, web sitesi ziyaretçisinin tarayıcısına kötü amaçlı kod yüklenmesine ve çalıştırılmasına neden olması durumunda ortaya çıkar. Bu kod daha sonra, yönetici düzeyinde erişim sağlayabilecek kullanıcının çerezlerini çalmak veya ek erişim sağlayabilecek kullanıcı olarak eylemler gerçekleştirmek gibi kötü amaçlı eylemler gerçekleştirebilir.
İki tür XSS vardır: depolanan XSS ve yansıtılan XSS. Önbelleğe alınmış XSS güvenlik açığı, bir saldırganın bir web sitesini daha sonra başka bir kullanıcının tarayıcısında sunulan ve çalıştırılan kötü amaçlı kodu önbelleğe almaya zorlayabilmesi durumunda ortaya çıkar. Önbelleğe alınmış XSS örneği, bir saldırganın WordPress web sitenizde kullanıcının çerezlerini çalan ve bunları bir yere gönderen kod içeren bir yorum yayınlamasıdır.
Yansıyan XSS, bir saldırgan kötü amaçlı kod içeren bir bağlantı oluşturduğunda ortaya çıkar. Bağlantı bir tarayıcıya yüklenmişse, web sitesi, web sitesi içeriğinin bir parçası olarak kötü amaçlı kod sunar. Bu kod daha sonra kullanıcının tarayıcısında yürütülür ve çerezleri çalabilir veya başka kötü amaçlı şeyler yapabilir. Genel olarak XSS, PHP’de bir güvenlik sorunu olarak görülebilir ve özel dikkat gösterilmesi gerekir.
Ross-Site İstek Sahteciliği veya CSRF güvenlik açığı
Siteler arası istek sahteciliği (CSRF), bir saldırganın kötü amaçlı bir bağlantı oluşturup site yöneticisinden veya ayrıcalıklı erişime sahip birinden bu bağlantıya tıklamasını isteyerek sitenin bir işlem yapmasına neden olması durumunda ortaya çıkar. Örneğin, bir saldırgan, yönetici tıkladığında bilinen parolayla yeni bir yönetici oluşturan bir bağlantı oluşturabilirse, bu bir CSRF saldırısı olacaktır. Bu sorun PHP güvenliği açısından önemlidir ve ele alınması gerekir.
WordPress’in “nonce” adı verilen bir özelliği kullanarak bu tür saldırılara karşı koruma sağlamanın akıllıca bir yolu vardır. Nonce, yöneticiye her oturum açtığında verilen bir güvenlik belirtecidir. Bir site yöneticisi WordPress‘te hassas bir şey yaptığında tarayıcısında bir “bir kez” ifadesi bulunur. Saldırganın CSRF saldırısında kullanmak üzere bir bağlantı oluşturmak istemesi durumunda, bu bağlantıyla gönderilecek “non” seçeneğini de bilmesi gerekir. Nonce günlük olarak değişir ve CSRF saldırılarını önler.
Kimlik doğrulamayı atla
Bazen bir PHP geliştiricisi izinlerin seviyesini kendisinin belirlediğini ve her kullanıcının kendi erişimine göre işlem gerçekleştirebileceğini düşünür.
Bu güvenlik ihlalinin WordPress uygulamalarına yaygın olarak girmesinin yollarından biri, WordPress geliştiricilerinin, birisinin yönetici olarak kimliğini doğrulamak için “is_admin()” adlı bir işlevi kullandıkları yaygın bir hatadır. Bu işlev aslında birisinin bir yönetici sayfasını görüntüleyip görüntülemediğini ve site ziyaretçisinin kimlik bilgilerinin gerçekten yönetici olup olmadığını size bildirmek için tasarlanmıştır. Bir geliştirici bu hatayı yaparsa, yönetici olmayan kullanıcıların yalnızca yöneticilerin erişebildiği özelliklere erişmesine izin verebilir. Bu, PHP güvenliğindeki bir kimlik doğrulama güvenlik açığıdır.
PHP’ye nesne enjeksiyonu
PHP’deki bu güvenlik açığı karmaşık bir saldırıdır ve bir PHP programının kullanıcı girdisini alıp bunu “unserialize()” adlı bir işleve göndermesiyle ortaya çıkar. Bu işlev, önbelleğe alınmış bir nesneyi alır ve onu bellek içi bir nesneye dönüştürür ve günümüzde PHP’nin güvenlik sorunlarından biri olarak kabul edilir.
Çözüm
Bu yazımızda PHP’nin güvenliğini ve buna bağlı sorunları ve güvenlik açıklarını incelemeye çalıştık. PHP’de göreceğiniz zafiyetlerin çoğu yüksek zafiyet türlerinden biri olacaktır. Ancak PHP güvenliğinin normal seviyede olduğu ve hala web geliştirme için en popüler dillerden biri olduğu söylenebilir.