Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Canyoupwn.me ~

TR | Linux PHP Sıkılaştırma

PHP Sıkılaştırma

Linux sistemlerimiz üzerinde yüklediğimiz PHP için başlangıçta gelen ayarlara ek olarak bazı değişiklikler yapmamız gerekmektedir.Default olarak gelen ayarlar kısmında güvenlik konusunda eksiklikler bulunmaktadır ve bunların bilinçli bir şekilde giderilmesi gerekmektedir.Bütün bu işlemlere başlamadan önce ilk hedefimiz düşmanımızı tanımak olmalıdır.Bu anlamda karşıdan bize gelebilecek olan saldırı türleri ve detayları hakkında ne kadar çok bilgi sahibi olursak kendimizi koruma konusunda o kadar başarılı oluruz.Sadece başlıklar halinde bahsetmek gerekirse zaafiyetler aşağıdaki gibi listelenebilir

  • Full Path Disclosure
  • Arbitrary File Upload
  • Arbitrary File Delete
  • Arbitrary File Download
  • Local File Inclusion
  • Remote File Inclusion
  • Cookie Injection
  • Header Injection
  • Sql Injection
  • Xml Injection
  • XXE Injection
  • Email Injection
  • Html Injection
  • Xpath Injection
  • Code Injection
  • Command Injection
  • Object Injection
  • Cross Site Scripting
  • Cross Site Request Forgery
  • Broken Authentication and Session Management

Evet ilk adımı gerçekleştirdik.Şimdi ise PHP yüklendiği zaman hazır gelen modülleri inceleyelim.Burdaki amacımız PHP modülleri arasında bizim ihtiyacımız olmayanları bulmak ve onları ihtiyacımız olana dek kaldırmaktır.

php -m

php1

Burada listelenenler arasından kaldırmak istediğimiz modülü 3 farklı şekilde kaldırabiliriz.

– rm komutu ile silebilirsiniz
– mv komutu ile adını değiştirebiliriz
– config ayarlarını değiştirerek disable edebiliriz.

Fakat burada belirtilen bütün modülleri kaldırmamıza PHP izin vermemektedir.Bunun için yapmamız gereken ilk kurulumda yüklenilmesi istediğimiz modülleri belirterek bu işlemi gerçekleştirmektir.

Bu adımı da hallettikten sonra şimdi sahip olduğumuz PHP’nin dışarıya bilgi sızdırmasını engellemeye çalışacağız.Bunun için php.ini dosyası içinde yer alan expose_php özelliğini

expose_php=off

şeklinde değiştiriyoruz.Burdaki amacımız PHP’nin dışarıya hangi server üzerinde çalıştığımız,hangi PHP versiyonunu kullandığımızı gibi bilgileri vermesini engellemektir.

PHP üzerinde bir hata oluştuğu zaman bu hatayı hata mesajı şeklinde dışarıya vermemek için yine php.ini içinde display_errors özelliğini disabled etmemiz gerekmektedir.

display_errors=Off

Disable ettiğimiz bu hata mesajlarını daha sonra log_erros özelliğini aktif ederek log kayıtları şeklinde tutmamız gerekmektedir.

log_errors=On
error_log?/var/log/httpd/php_scripts_error.log

Daha sonra yine php.ini dosyası içindeki file_uploads özelliğini kapatmamız gerekmektedir.

file_uploads=off

Burdaki amacımız dışarıdan bizim istediğimiz dışında dosya girişine izin vermemek ve bunu en basit yoldan engellemektir. Projemizde dışarıdan dosya alımı gibi bir işlev kullanmamız gerektiğini farzedelim.Bu gibi durumlarda yapmamız gereken file_upload özelliğini aktif etmek ve buna ek olarak dışarıdan gelen dosyaların maksimum boyutlarını belirtmemiz gerekmektedir.

file_uploads=On
upload_max_filesize=1M

Yukarda bahsi geçen saldırı çeşitlerinden RFI saldırısına karşı önlem almak amacıyla php.ini dosyası içerisinde yer alan allow_url_fopen ve allow_url_include özelliklerinin kapatılması gerekilmektedir

allow_url_fopen=Off
allow_url_include=Off

Yine aynı şekilde php.ini dosyası içerisinde yer alan sql.safe_mode özelliğini de aktif etmememiz gerekmektedir.

sql.safe_mode=On

Bunu özellliği aktif hale getirdiğimiz zaman mysql_connect,mysql_pconnect gibi fonskiyonlar dışarıdan gelen argümanları göz ardı ederek sadece başlangıçta bizim tanımladığımız parametrelere göre hareket etmektedir.
Sonraki adımda yapmamız gereken POST işlem boyutlarını kontrol sınırlamaktır.Bunun için yapmamız gereken php.ini dosyası içerisinde post_max_size ifadesine değer atamaktır.

post_max_size=1K

Bunu yapmaktaki amacımıza gelecek olursak eğer karşımızda kötü niyetli bir kullanıcı varsa,bizim sistemimize boyutu çok büyük bir POST isteği atmayı deneyebilir ve böylece bizim kaynaklarımızı sömürmüş olur.Bİzde bu ve bunun gibi durumlardan kaçınmak için bunun üst sınırını belirleyerek önlem alırız.

Şimdi ise sahip olduğumuz kaynakların kontrolünü sağlamak için yine php.ini dosyası içindeki bazı değerleri belirleyeceğiz.

max_execution_time = 30
max_input_time = 30
memory_limit = 40M

Yukarıdaki işlemlerde bir PHP scriptinin maksimum çalışma zamanını,yine bu script için maksimum input süresini belirlemiş olduk.Son olarak ise bir PHP scriptinin tüketebileceği maksimum hafıza miktarı için limit belirleyerek kontrolsüz bir şekilde bir PHP sayfasının kaynaklarımızı harcamasına engel oluyoruz.
Bir sonraki güvenlik önlemi olarak PHP içinde yer alan ve tehlikeli olarak adlandırılan fonskiyonları kaldırmaktır.Bunun için php.ini dosyasında aşağıdaki ayarları yapmamız gerekmektedir.

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Buradaki amacımızdan bahsetmeden önce burda kullanılan fonksiyonlardan bazılarından bahsedelim.

shell_exec fonksiyonu kabuk üzerinde komut çalıştırılmasını sağlar ve çalışan komutun çıktısını geri döndürür.

curl_exec fonksiyonu bir curl oturumunu işleme sokar

parse_ini_file fonksiyonu ise bir yapılandırma dosyasını çözümler.

Evet bazı fonksiyonlardan bahsettik ve gördüğünüz üzere bu fonksiyonlar dışarıdan sistem üzerinde komut çalıştırılması,dışarıya bilgi çıkarılması gibi tehlikeli durumlara sebep olabilmektedir.Bu yüzden bu fonskiyonların disabled edilmesi gerekmektedir.

Şimdi ise PHP’nin hangi klasör yapısı altında çalışmasına izin verileceğini belirlememiz gerekmektedir.Tek klasör altında çalışmasına izin verilebileceği gibi birden fazla klasör altında çalışmasına izin de verilebilir.Bunun için php.ini dosyası içerisinde

 

open_basedir="/var/www/html"

şeklinde düzenleme yapabiliriz.Böylelikle bu klasöre yetkisi olmayan kişilerin sistem üzerinde PHP kodlarını çalıştırmasını engellemiş oluruz.
PHP üzerinde gerçekleşen session işlemlerinin kayıtlarının tutulduğu bir dizin vardır.Bu dizin bütün kullanıcılara açık bir dizin ise session ile ilgili bilgileri başkalarının da okumasına olanak sağlar.Bu durumdan korunmak için php.ini dosyası içinde aşağıdaki değişikliği yaparız.

session.save_path="/var/lib/php/session"
upload_tmp_dir="/var/lib/php/session"

Daha sonra belirlediğimiz yolu sadece root yetkisi ile müdahale edilecek şekilde değiştirelim

chmod 0700 /var/lib/php/session

En son olarak kontrol ettiğimizde çıktı bu şekilde olmaktadır.

php2
Bunun dışında daha genel bir güvenlik önlemi olarak sistemimi her zaman güncel tutmamız gerekmektedir.Bunun için Linux,Apache,PHP ve MySQL için gelen güvenlik güncellemelerini almamız önerilmektedir.Eğer PHP’yi paket yöneticisi ile kurduysak

yum update

komutu ile ya da

apt-get update && apt-get upgrade

komutu ile güncellemeleri alabiliriz.

Sonraki adım olarak dosya ve dizin erişimi üzerinde değişiklikler yapmalıyız.Öncelikli olarak Apache’yi root olmayan bir kullanıcı ile çalıştırmamız gerekmektedir.Bütün dosyalar ve dizin yapısı root olmayan bir kullanıcı tarafından sahiplenilmedilir.Bunun için aşağıdaki kod ile dizinin sahibini direk olarak değiştirebiliriz.

chown -R apache:apache /var/www/html/

Bu dosyalara verilen izinlerin sadece okuma izni olduğundan emin olmak için aşağıdaki komutu çalıştırıyoruz.

chmod -R 0444 /var/www/html/

Bu işlemi de gerçekleştirdikten sonra aşağıdaki şekilde kontrol edebiliriz.

php3
Bitmek bilmeyen güvenlik önlemlerinin bir diğer adımı olarak Apache,PHP,MySQL konfigurasyon dosyalarının izinlerini yazmaya karşı korumalı olarak değiştiriyoruz.

chattr +i /etc/php.ini
chattr +i /etc/php.d/*
chattr +i /etc/my.ini
chattr +i /etc/httpd/conf/httpd.conf
chattr +i /etc/

Bu komutu /var/www/html dizini altındaki dosyaları için de uygulayabiliriz.

chattr +i /var/www/html/

Daha sonra sisteme düşen logları düzenli bir şekilde takip etmemiz gerekmektedir.Apache log dosyaları için

tail -f /var/log/httpd/error_log
grep 'login.php' /var/log/httpd/error_log
egrep -i "denied|error|warn" /var/log/httpd/error_log

komutlar ile,PHP logları için

tail -f /var/log/httpd/php_scripts_error.log
grep "...etc/passwd" /var/log/httpd/php_scripts_error.log

komutları ile istenen takibi yapabiliriz.
Son olarak ise dışarıdan ekstra programlar yükleyerek güvenliği artırabiliriz.Örneğin Mod_securtiy programını yükleyerek ve üzerinde bazı kurallar belirleyerek saldırılardan korunabiliriz.SELinux prgoramı ile Apache’nin SELinux ile korunmasını sağlayabiliriz.(Not:Yazıda bahsedilen php.ini,error_log gibi dosyaları tam yolları sistemler ve sürümler arasında farklılık gösterebilir.Bahsedilen kodların tam olarak çalışması için doğru yolların verildiğinden emin olunuz)


About Ali TONKAZ

Sakarya Üniversitesi