PHP, web uygulamalarında sık kullanılan bir sunucu tarafı betik dilidir. Ancak PHP ile ilgili güvenlik sorunları çoğu zaman koddan değil, hatalı sunucu yapılandırmalarından doğar. Varsayılan ayarlarla çalışan PHP kurulumları, özellikle paylaşımlı ortamlarda tüm sunucuyu savunmasız bırakabilir. Ele alınan güvenlik önlemleri, PHP’nin davranışlarını işletim sistemi düzeyinde sınırlandırmayı hedefler.
PHP Tarafında Sık Görülen Saldırı Türleri
PHP sistemlerinde saldırganlar genellikle uygulamayı değil, doğrudan sunucuyu hedef alır. Bu yaklaşımda öne çıkan saldırı türleri şunlardır.
Remote Code Execution (RCE)
PHP üzerinden sistem seviyesinde komut çalıştırılmasını sağlar. Kritik fonksiyonlar kapatılmadığında ortaya çıkar.
disable_functions = exec,system,shell_exec,passthru,proc_open,popenDosya Yükleme Üzerinden Web Shell
Kontrolsüz upload alanları saldırganlar için giriş noktasıdır. PHP dosyası yüklenip çalıştırılabilir.
location /uploads {
php_admin_flag engine off;
}Local File Inclusion (LFI)
Yanlış include kullanımı sonucu sistem dosyalarına erişim sağlanabilir. Log poisoning ile birleştiğinde RCE’ye dönüşebilir.
open_basedir = "/var/www/site:/tmp"SQL Injection
Filtrelenmeyen kullanıcı girdileri SQL sorgularını bozabilir. Veritabanı ele geçirilmesiyle sonuçlanabilir.
SELECT * FROM users WHERE id = ?Bu saldırılar, PHP’nin erişim alanı kısıtlanmadığında ortaya çıkar.
PHP’yi Her Zaman Güncel Tutalım
PHP tarafında güvenliği artırmanın en temel yolu, güncel ve desteklenen sürümleri kullanmaktır. EOL durumundaki PHP 7.x sürümleri üretim ortamlarında ciddi güvenlik riski oluşturur.
Paket yöneticisi üzerinden güvenlik güncellemeleri düzenli olarak uygulanmalıdır.
PHP 7.4.3’ten PHP 8.x’e yükseltme işlemini komut satırından adım adım anlatan rehber, geçiş sürecini güvenli şekilde planlamanı sağlar.
🟠 PHP 7.4 Sürümünü Komut Satırıyla PHP 8’e Taşıma
Dosya Sistemi Erişimini Sınırlama
PHP, dosya sistemi üzerinde doğrudan işlem yaptığı için yanlış yapılandırmalar ciddi güvenlik sorunlarına yol açabilir. Bu yüzden ilk adım olarak PHP’nin erişebileceği dizinler açık şekilde tanımlanmalıdır.
open_basedir = "/var/www/site:/tmp"PHP İşlemlerinin Yetkisi
Root yetkisiyle çalışan PHP süreçleri, bir güvenlik açığında tüm sunucunun kaybedilmesine neden olabilir. Bu nedenle PHP-FPM veya CGI süreçlerinin düşük yetkili kullanıcılarla çalışması zorunludur.
ps aux | grep phpHer uygulama için ayrı bir PHP-FPM havuzu ve kullanıcı tanımlamak gerekir. Plesk ortamlarında domain bazlı PHP-FPM havuzu ve kaynak limitleri kullanılarak bu yapı net şekilde uygulanabilir.
PHP Fonksiyonlarını Devre Dışı Bırak
PHP varsayılan olarak sistem komutu çalıştırabilen fonksiyonlarla gelir. Uygulama kullanmıyorsa açık kalmamalıdır.
disable_functions = exec,system,shell_exec,passthru,popen,proc_openPHP’nin İletişimini Sınırla
Uzak dosya erişimi çoğu zaman zincirleme açıkların başlangıcıdır. Varsayılan olarak kapalı olmalıdır.
allow_url_fopen = Off
allow_url_include = OffPHP Loglarını Ayır ve İzle
PHP error log’ları sadece debug değil, saldırı tespiti içindir. Her PHP-FPM havuzu için ayrı log dosyaları tanımlanmalıdır. Loglar merkezi sistemlere aktarılmalı ve izlenmelidir.
PHP Modüllerini Ters Mantıkla Yönet
Önce neye ihtiyaç olduğunu belirle, sonra modülleri aç. Kullanılmayan her modül ek saldırı yüzeyidir.
php -m
mv /etc/php.d/xmlrpc.ini /etc/php.d/xmlrpc.off
systemctl restart php-fpmDosya Yükleme Mekanizmalarını Daralt
Dosya yükleme mümkünse kapatılmalıdır. Zorunluysa sınırlandırılmalıdır.
file_uploads = On
upload_max_filesize = 2M
upload_tmp_dir = /var/lib/php/tmpPHP Hata Mesajlarını Kullanıcıdan Gizle
Hata mesajları saldırgan için ipucu olabilir. Ekran kapalı, log açık olmalıdır.
display_errors = Off
log_errors = On
error_log = /var/log/php/runtime-error.logScript Süresi ve Bellek Sınırları Koy
Sonsuz veya ağır script’ler saldırı olmasa bile sorundur. Temel sınırlar mutlaka tanımlanmalıdır.
max_execution_time = 30
max_input_time = 30
memory_limit = 256MDosya ve Dizin İzinlerini En Sona Al
En doğru zaman en sondur. Artık uygulamanın nereye yazdığını biliyorsundur.
find /var/www/site -type f -exec chmod 0444 {} \;
find /var/www/site -type d -exec chmod 0555 {} \;SELinux ve WAF ile İkinci Savunma Katmanını Kur
PHP ayarları ilk savunma hattıdır. SELinux ve WAF ikinci katmandır.
getsebool -a | grep httpdSık Sorulan Sorular
PHP-FPM varken PHP güvenlik ayarlarını neden hâlâ uygulamalıyım?
PHP-FPM yalnızca süreçleri ayırır, erişim ve yetki sınırlarını tek başına belirlemez. Yanlış yapılandırma durumunda uygulama açığı sistem geneline yayılabilir.
Bir PHP uygulamasının hangi dosyalara erişmeye çalıştığını nasıl analiz ederim?
PHP-FPM sürecini sistem seviyesinde izleyerek bu davranışı net şekilde görebilirsin. Bu yöntem özellikle dosya erişimlerini ortaya çıkarır.
strace -f -p $(pgrep -n php-fpm)PHP üzerinden veri sızıntısı olup olmadığını nasıl tespit ederim?
Ağ davranışı analiz edilmelidir. PHP proseslerinin olağan dışı dış bağlantılar kurup kurmadığı kontrol edilmelidir.
ss -tpn | grep phpProd ve staging ortamları arasındaki PHP hatalarının temel nedeni nedir?
Çoğu zaman PHP güvenlik ayarları arasındaki farklardır. Özellikle fonksiyon kısıtları ve dosya erişim ayarları kontrol edilmelidir. Sorunlu ayar izole edilerek çözüm üretilmelidir.