Secure Development On PHP – Part 3 : Best Practices

thumbnail

Introduction

Berdasarkan data dari W3Techs pada April 2019, PHP merupakan bahasa pemrograman server-side terpopuler dan digunakan oleh 79% website yang ada. Tapi,apakah semua developer sudah tahu tentang secure development pada PHP? Lantas,bagaimana secure development pada PHP itu? Jawabannya ada pada artikel dibawah ini yang dibagi dalam beberapa part.

Best Practices

Praktik keamanan terbaik dalam hal perangkat lunak yaitu memastikan bahwa selalu up to date dengan security patches terbaru dan menjalankan versi stabil terbaru. Dalam hal PHP, memastikan bahwa menggunakan versi server terbaru (misalnya, Apache) dan harus secara teratur memeriksa dan patching sistem operasi (misalnya, Linux atau Windows).

Terkadang penyerang memanfaatkan tidak hanya kesalahan dalam keamanan aplikasi PHP tetapi juga konfigurasi project PHP atau PHP yang tidak aman. Konfigurasi yang buruk dapat memudahkan malicious user untuk melakukan serangan seperti SQL Injection (SQLi), Cross-site Scripting (XSS), atau Cross-site Request Forgery (CSRF).

Catatan: Sebelum mengubah konfigurasi sisi server, pastikan bahwa halaman web Anda tidak bergantung pada fungsionalitas yang akan Anda ubah karena ini dapat mengakibatkan rusaknya aplikasi web Anda.

PHP Version Exposure

Pada Konfigurasi Default, versi PHP akan muncul di X-Powered-By pada header :

PHP Security

Untuk menghilangkannya,bisa mengubah expose-php pada file php.ini :

expose_php = Off

Script Name Exposure

Pada Konfigurasi Default, PHP menambahkan header X-PHP-Originating-Script ke email yang dikirim menggunakan fungsi mail (). Nilai header ini mencakup ID pengguna dan nama file skrip PHP tempat email dikirim. :

PHP Security

Header mungkin mengekspos nama file, yang kemudian dapat ditargetkan oleh attacker. nonaktifkan header ini dengan mengubah mail.add_x_header di file konfigurasi php.ini ke Off:

mail.add_x_header = Off

Error Reporting

Error dapat mengekspos informasi sensitif tentang konfigurasi server atau kode aplikasi.

Misalnya, ini adalah kesalahan umum yang menunjukkan kerentanan terhadap serangan SQL Injection:

PHP security

Error code ini memperlihatkan nama pengguna database MySQL, metode koneksi database (ekstensi mysqli), dan path ke skrip yang dieksekusi:

PHP Security

Halaman yang mengandung kesalahan juga dapat di temukan oleh search engine. Attacker menggunakan kata kunci spesifik untuk menemukan halaman tersebut dan mengeksploitasinya.

Error Reporting dapat dinonaktifkan dengan mengubah display_errors dalam file konfigurasi php.ini ke Off:

display_errors = Off

Jika display_errors diatur ke Off, responsnya menjadi:

PHP security

Error message masih muncuk karena kode PHP ini memeriksa apakah koneksi ke database berhasil. Jika tidak, menampilkan informasi tentang error:

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error); 
}

Jika ingin menyembunyikan error message database, hapus $ conn-> connect_error dari output string.

if ($conn->connect_error) {
  die("Connection failed"); 
}

Sehingga error menjadi :

PHP Security

Session Cookies

The httponly Flag

httponly flag mencegah Client-side JavaScript mengakses nilai cookie. biasanya digunakan untuk Cross-site Scripting (XSS). Misalnya, jika aplikasi web rentan terhadap serangan XSS maka payload tidak akan dapat mencuri cookie yang ditandai sebagai httponly. Ini sangat berguna untuk session cookies.

Tanpa flag httponly, JavaScript dapat mengakses session cookie:

PHP Security

atur session.cookie_httponly ke On di file konfigurasi php.ini:

session.cookie_httponly = On

The Secure Flag

Secure flag memastikan bahwa session cookie PHP hanya dikirim melalui koneksi terenkripsi (HTTPS).Sehingga, session cookie terlindungi dari serangan man-in-the-middle (MITM). Untuk melakukan ini, ubah session.cookie_secure ke On di file konfigurasi php.ini:

session.cookie_secure = On

Session Fixation

Server membuat session untuk melacak pengguna dan menyimpan informasi tentang mereka. Session Fixation berarti pengguna dapat secara manual mengatur session dengan mengirimkan permintaan ke server dengan ID session yang ingin mereka buat. Attacker dapat menggunakan ini untuk menipu pengguna untuk menggunakan ID session tertentu dan kemudian mengakses data / akun / informasi mereka. untuk mengurangi sebagian, atur session.use_strict_mode ke On di file konfigurasi php.ini:

session.use_strict_mode = On

Remote File Inclusion

allow_url_include dan allow_url_fopen memungkinkan PHP untuk mengunggah file dari remote server dan memperlakukannya sebagai file lokal. Jika menggunakan include (), require (), atau file_get_contents () functions insecurely pada script, attackerdapat mengambil keuntungan dan memasukkan malicious code menggunakan file upload dari remote server (kerentanan ini disebut remote file inclusion) . Jika attacker dapat menyuntikkan kode ke file, alih-alih mengunggah / hosting PHP backdoor shell di server target, mereka dapat menulis hanya satu baris kode dan memasukkan shell dari jarak jauh.

PHP Configuration

nonaktifkan di file konfigurasi php.ini:

allow_url_fopen = Off
allow_url_include = Off

Directory Traversal

Menggunakan directory traversal, attacker dapat mengakses file yang berada di luar direktori document root. Ada beberapa cara untuk membatasi skrip PHP dari mengakses file di luar direktori document root. Salah satunya adalah mengatur direktif open_basedir di php.ini. Secara default, direktif ini kosong. Ini memungkinkan skrip untuk menelusuri file di mana saja dalam sistem file selama pengguna memiliki akses ke sana.

Ini adalah efek dari konfigurasi default jika request untuk fungsi include () tidak divalidasi:

PHP Configuration

batasi penyertaan file ke direktori root dengan mengubah direktif open_basedir di file konfigurasi php.ini:

open_basedir = /var/www/html/

untuk multiple directory:

open_basedir = /var/www/html/:/var/www/html2/:/var/www/html3/

Jika Anda mengatur open_basedir, Anda juga harus mengatur direktif upload_tmp_dir ke direktori yang dapat ditulis oleh pengguna web dan yang ada di dalam direktori document root. Secara default, PHP menggunakan / tmp /, yang dalam hal ini tidak akan berfungsi.

upload_tmp_dir = /var/www/html/tmp/

Shell Commands

sangat berbahaya untuk mengaktifkan fungsi shell. Jika menonaktifkan fungsi-fungsi ini, dapat dipastikan bahwa setiap backdoor yang menggunakan fungsi-fungsi ini gagal berfungsi. Untuk menonaktifkannya, pastikan dulu tidak ada skrip yang menggunakannya. Kemudian, masukkan perubahan berikut pada file konfigurasi php.ini:

disable_functions = 
  pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,
  pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,
  pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,
  pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,
  pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
  exec,shell_exec,passthru,system

Conclusion

Dengan mengatur konfigurasi web server, dapat meminimalisir kerentanan yang muncul saat pembuatan aplikasi.

Reference

Leave a Reply

Your email address will not be published. Required fields are marked *

Back To Top