1 LAPORAN TUGAS AKHIR Mata Kuliah EI 7012 KEAMANAN JARINGAN INFORMASI Dosen : Dr.BUDI RAHARJO KEAMANAN PADA APLIKASI WEB DENGAN PHP Oleh : ABD. THALIB...
BIDANG KHUSUS TEKNOLOGI INFORMASI PROGRAM MAGISTER TEKNIK ELEKTRO PROGRAM PASCASARJA INSTITUT TEKNOLOGI BANDUNG 2003
ABSTRAK
PHP merupakan bahasa script yang digunakan untuk membuat halaman web yang dinamis. Dinamis berarti halaman yang akan ditampilkan dibuat saat halaman itu diminta oleh klien. Konsep kerja PHP, sama halnya dengan HTML yang diawali dengan permintaan suatu halaman web oleh browser. Berdasarkan URL (Uniform Resource Locator) browser mendapat alamat dari web browser, mengidentifikasi dan menyampaikan segala informasi yang dibutuhkan web server. Ketika berkas PHP yang diminta didapat oleh web server, isinya langsung dikirimkan ke mesin PHP untuk diproses dan memberi hasilnya (berupa kode HTML) ke web server. Selanjutnya web server menyampaikan ke klien. PHP adalah aplikasi yang open source dan mempunyai fasilitas autoglobal pada varibel, programer diberikan kemudahan untuk mengaplikasikannya. Tetapi kemudahan ini pula yang memudahkan attacker untuk merusak setiap program dijalankan. Serangan ini dapat dihindari (diminimalkan) dengan mengadakan pengamannya. Untuk itu tulisan ini akan mengkaji berbagai sumber tentang aspek potensial yang mudah diganggu keamanannya pada scrip PHP dan membuat alternatif solusi penangannya.
KATA PENGANTAR
Puji dan syukur saya panjatkan kehadirat Allah SWT atas rahmat dan karunia-NYA, sehingga saya dapat menyelesaikan tugas akhir mata kuliah : EI 7012 – KEAMANAN JARINGAN INFORMASI, dengan topik “KEAMANAN PADA APLIKASI WEB DENGAN PHP”. Pembahasan materi ini akan mengkaji aspek potensial yang mudah diganggu keamanannya pada skrip PHP dan membuat alternatif solusi penangannya, yang bersumber dari studi internet di beberapa situs. Dalam rangka menambah pengetahuan saya berkenaan dengan ilmu pengetahuan yang berhubungan dengan mata kuliah yang saya ikuti. Oleh karena itu, saya merasakan masih banyak kekurangan dalam uraian tulisan saya ini. Untuk itu kritik dan saran sangat saya harapkan demi perbaikan di masa yang akan datang. Ucapan terima kasih saya sampaikan kepada Bpk.Dr.Budi Raharjo. yang telah memberi bimbingan dan ilmunya kepada saya, semoga menjadi amal baik nantinya. Amin.
Bandung, Oktober 2003
Penulis
DAFTAR ISI
Halaman Judul ………………………………………………………………
i
Abstrak ………………………………………………………………………
ii
Kata Pengantar ………………………………………………………………
iii
Daftar Isi ……………………………………………………………………..
iv
Daftar Gambar ……………………………………………………………….
v
BAB I PENDAHULUAN
……………………………………………….
1
…………………………………………………...
1
2. Skrip PHP ……………………………………………………………
1
3. Konsep Kerja PHP ………………………………………………….
3
4. Lubang Keamanan PHP ……………………………………………..
5
BAB II KEAMANAN PADA APLIKASI WEB DENGAN PHP ………..
6
1. Variabel Auto Global …………..…………………………………...
6
2. Fungsi Include(), Require() atau fopen
…………………………….
9
3. Hilangkan Karakter-Karakter Escape Dalam Perintah SQL …………
11
4. Hindari Upload Yang Salah …..…………………………………….
13
5. Hilangkan Karakter-Karakter Escape HTML Dalam Teks …………
13
6. Gunakan Ekstensi .php Untuk Semua File Script ..…………………
14
7. Tempatkan Isi Yang Sensitif Di Luar Direktori Root Dokumen ……
14
8. Berhati-Hati Terhadap Server Bersama ……………………………..
15
9. Hindari Pengertian Yang Ruwet dan Semaunya ……………………
16
10. Pengecekan Kondisi Dengan Jenis Variabel Yang Tidak Jelas ……..
18
11. Session Spoofing …………………………………………………….
19
12. Beberapa Tips Untuk Pengamanan Aplikasi Web Dengan PHP …….
20
BAB III KESIMPULAN ………………………………………………….
22
1. Apakah Itu PHP?
DAFTAR PUSTAKA
DAFTAR GAMBAR
Gambar 1. Tampilakn Kode HTML Pada Browser …………………………
2
Gambar 2. Tampilakn Kode PHP Pada Browser ……………………………
3
Gambar 3 Konsep Kerja HTML ………….…………………………………
4
Gambar 4. Konsep Kerja PHP ………………………………………………
4
BAB I PENDAHULUAN
1. Apakah PHP Itu? PHP adalah singkatan dari PHP Hypertext Preprocessor yaitu bahasa berbentuk skrip yang ditempatkan di server dan dijalankan oleh server. Hasilnya ke klien tempat pemakai menggunakan browser. PHP dirancang untuk membentuk web dinamis. Artinya PHP dapat membentuk suatu tampilan berdasarkan permintaan terkini. Misalnya
dapat
mengakses database dan menampilkannya di halaman web serta ineraktif dengan cepat dan mudah. PHP dapat berinteraksi dengan hampir semua teknologi web yang sudah ada. Developer dapat menulis sebuah program PHP yang mengeksekusi suatu program CGI (Common Gateway Interface) di server web lain. Skrip-skrip PHP semula berawal dari skrip Perl yang dikemas menjadi tool yang disebut “Personal Home Page”. Paket inilah yang menjadi cikal bakal PHP. Pada tahun 1995, Rasmus Lerdroft menciptakan PHP/FI Versi 2. Pada versi ini pemrogram dapat menempelkan kode terstruktur di dalam tag HTML. Pada awalnya, PHP dirancang untuk diintegrasikan dengan web server Apache. Namun sekarang PHP juga dapat bekerja dengan web server seperti PWS (Personal Web Server), IIS (Internet Information Server), dan Xitami. PHP bersifat bebas dipakai (open source), dan software-nya dapat di-download melalui situs www.php.net.
2. Skrip PHP Skrip PHP berkedudukan sebagai tag dalam bahasa HTML. Sebagaimana diketahui, HTML (HyperText Markup Language) adalah bahasa standar untuk membuat halaman-halaman web. Berikut adalah contoh kode HTML dan kode PHP.
Kode HTML :
Abd.Thalib - 23202112
Kode HTML Ini Menggunakan Kode HTML
Bila dijalankan melalui browser, maka hasilnya sebagai berikut:
Gambar 1. Tampilakn Kode HTML Pada Browser
Kode PHP yang berada dalam kode HTML
Kode PHP Ini Menggunakan Kode PHP Abd.Thalib - 23202112
Kode PHP diawali dengan . Pasangan kedua kode inilah yang befungsi sebagai tag kode PHP. Berdasar tag inilah, server dapat memahami kode PHP dan memprosesnya. Hasil dari skrip di atas adalah sebagai berikut:
Gambar 2. Tampilakn Kode PHP Pada Browser
3. Konsep Kerja PHP Konsep kerja HTML diawali dengan permintaan suatu halaman web oleh browser. Berdasarkan URL (Uniform Resource Locator) ataudikenal dengan internet, browser mendapat alamat dari web serve, mengidentifikasi halaman yang dikehendaki, dan menyampaikan segala informasi yang dibutuhkan oleh web server. Selanjutnya, web server akan mencarikan berkas yang diminta dan membrikan isinya ke browser. Browser yang mendapatkan isinya segera melakukan proses penerjemahan kode HTML dan menampilkannya ke layar pemakai (klien). Abd.Thalib - 23202112
Web Web Server Server
Kode HTML
Permintaan HTTP (sesuatu html)
Tanggapan HTTP Browser
Klien
Gambar 3 Konsep Kerja HTML Pada PHP prinsip kerjanya sama, hanya saja ketika berkas PHP yang diminta didapatkan oleh web server, isinya segera dikirimkan ke mesin PHP dan mesin inilah yang memproses dan memberikan hasilnya (berupa kode HTML) ke web server. Selanjutnya, web server menyampaikannya ke klien.
Web Web Server Server
Skrip PHP
Mesin PHP Permintaan HTTP (sesuatu PHP)
Browser
Klien
Kode HTML Tanggapan HTTP
. Gambar 4. Konsep Kerja PHP
Abd.Thalib - 23202112
4. Lubang Keamanan PHP PHP dapat dijalankan sama seperti aplikasi CGI (Common Gateway Interface) seperti web server yang terintegrasi. Interpreter PHP mempunyai kemampuan untuk mengakses hampir semua host-file system, network interfaces, IPC, dan lain-lain. Konsekwensinya PHP potensial mendapat serangan dari attacker. Untuk meminimalkan serangan programmer harus menyadari dan mengetahui halhal yang tidak diharapkan (merusak) saat program dijalankan, yaitu pengetahuan kelemahan suatu sistem dan modus serangan secara umum yang diarahkan untuk mengganggu keamanan program tersebut Lubang keamanan yang paling umum di dalam skrip PHP dan tak terkecuali pada aplikasi web yang manapun, adalah berkaitan dengan User Input. Banyak skrip menggunakan informasi user yang legal dalam bentuk format web dan memproses informasi ini dengan berbagai cara. Jika user input ini dilegalkan tanpa batasan, maka user input potensial menyisipkan perintah-perintah yang tidak diinginkan dalam skrip.
Abd.Thalib - 23202112
BAB II KEAMANAN PADA APLIKASI WEB DENGAN PHP
Aplikasi web dengan PHP telah menjadi hal yang populer dalam menyediakan akses global terhadap data, pelayanan, dan produk. Akan tetapi, akses global yang merupakan keuntungan utama penggunaan web ini juga memberikan lubang-lubang keamanan yang bisa diakses secara global dan sering disalahgunakan. Memang bukan hal yang sulit untuk membuat aplikasi web menggunakan skrip PHP, tetapi aplikasi ini bisa jadi mengandung lubang-lubang berbahaya tanpa disadari. Kejadian ini ditampilkan oleh banyak aplikasi web umum lainnya., termasuk PHP yang ternyata memiliki lubang-lubang keamanan berbahaya. Kode program sering dibuat untuk mengidentifikasi lubang ini, tetapi biasanya kode program tersebut mudah diakses oleh publik. Tulisan
ini
menampilkan
langkah-langkah
yang
dapat
membantu
mengidentifikasi atau menghindari lubang-lubang demikian dalam aplikasi yang dituliskan dengan menggunakan PHP.
1. Variabel Auto Global Pada umumnya aplikasi PHP yang memiliki lubang keamanan berasal dari kemampuan varibel autoglobal. Dengan adanya fasilitas autoglobal pada varibel, programer diberikan kemudahan mengaplikasikan skrip PHP, tapi memudahkan pula terjadinya lubang keamanan. Dengan fasilitas ini suatu varibel misalnya $x tidak perlu dideklarasikan dahulu dan bisa merupakan varibel session, varibel cookie, varibel dari GET/POST. Tentu saja sebenarnya kelemahan keamanan bukan semata-mata berawal dari varibel autoglobal, melainkan juga kurangnya kewaspadaan dari programer itu sendiri. Akibat lubang kemanan tersebut dapat mengakibatkan hal-hal berikut: a). denial of service,
Abd.Thalib - 23202112
b). authentication failure, c). account hijacking, d). perusakan tampilan(layout), e). implantasi virus web browser,dan lain-lain. Kebanyakan aplikasi PHP yang ditemukan lubang keamanannya akibat varibel autoglobal ini adalah aplikasi yang open source, karena user dapat mengetahui kode aplikasi dan mengetahui nama-nama varibel yang digunakan. Jadi dengan sedikit trik 'security through obscurity' sebenarnya skrip agak terlindungi dari akibat fasilitas varibel autoglobal ini. Tapi tentu saja cara itu bukan hal yang baik, karena cepat atau lambat lubang itu akan ditemukan. Jika pilihan register_globals diaktifkan, maka PHP akan membentuk variabel global untuk setiap variabel GET, POST, dan cookie termasuk dalam meminta (request) HTTP. Ini berarti bahwa attaker kemungkinan mampu mengatur variabel-variabel ini di luar perkiraan. Perhatikan kode berikut yang ditujukan untuk melakukan akses tanpa nama terhadap sebuah artikel tunggal dan meminta autentifikasi untuk semua artikel lain: // anggaplah bahwa $article_id ditentukan oleh URL if ($article_id == 0) { $guest_ok = true; } if (!$guest_ok) { // cek apakah pengguna diizinkan dengan menggunakan fungsi yang // didefinisikan pada tempat lain check_auth(); }
Kode ini mungkin terlihat dapat dijalankan karena variabel $guest_ok secara umum akan diinisialisasi false. Akan tetapi, jika user memasukkan guest_ok=1 dalam URL, maka dia akan lolos autentifikasi dan mengakses artikel apapun dalam sistem.
Abd.Thalib - 23202112
Permasalahan yang sama dapat muncul saat melakukan pengecekan keamanan saat terlihat hubungan (link) ke halaman, tetapi tidak melakukan pengecekan keamanan pada halaman yang terhubung dengan user. Dalam sebuah sistem di mana user mendapat hak akses untuk memilih daftar artikel. Programmer seharusnya melakukan pengecekan keamanan saat mengeluarkan daftar artikel yang tersedia dan saat menampilkan sebuah artikel yang sudah dipilih dari daftar itu. Tanpa melakukan pengecekan ini, attacker dapat mengetik kode URL untuk artikelartikel yang seharusnya tidak boleh diakses olehnya dan melihat artikel itu tanpa kesulitan. Variasi umum lain untuk permasalahan ini adalah menggunakan fitur “Remember My Login” dengan menyimpan pengenal user dalam sebuah cookie, yang mengizinkan user mengubah nilai cookie-nya untuk login. Permasalahan ini dapat muncul di sembarang tempat dalam skrip yang dibuat. Perhatikanlah dengan hati-hati daerah-daerah berikut. ▪
Kode pengecekan autentifikasi dan izin.
▪
Gunakan variabel sebelum diinisialisasi(dapat diatur melalui error_reporting)
▪
Gunakan variabel yang dirancang untuk mengatur permintaan oleh perintah GET atau POST. Langkah-langkah yang dapat dilakukan untuk mengatasi permasalahan ini
adalah sebagai berikut. ▪
Menonaktifkan register_globals dalam file php.ini. Sesudah melakukan perubahan
ini,
Anda
akan
menggunakan
$HTTP_GET_VARS
dan
$HTTP_POST_VARS yang berhubungan dengan array untuk mengakses input GET dan POST sebagai pengganti penggunaan variabel global. Hal ini mungkin akan membosankan, tetapi jauh lebih aman. ▪
Jika fungsi “Remember My Login” dibutuhkan, masukkan sebuah password atau berusaha keras menebak pengenal acak dalam cookie (fungsi “Remember My Login” masih bisa memberikan lubang keamanan lain seperti pengguna jahat yang membagi sebuah mesin dengan seorang pengguna resmi untuk mendapatkan akses).
Abd.Thalib - 23202112
▪
Menuliskan kode untuk menginisialisasi variabel global. Kode fragmen di atas dapt dikembangkan dengan menginisialisasi $guest_ok sehingga bernilai false di awal script.
▪
Menjamin suatu variabel bahwa variabel itu benar-benar datang dari suatu bagian dan tidak berasal dari attacker.
▪
Menuliskan kode untuk mengecek bahwa variabel global tidaklah berada dalam array $HTTP_POST atau $HTTP_GET.
2. Fungsi include(), require() atau fopen() Akibat mekanisme autoglobal, suatu varibel dalam php menjadi tidak jelas jenisnya. Jenis variabel jadi tidak dapat dibedakan antara variabel dari GET/POST, varibel dari ENVIRONTMENT atau varibel dari COOKIES/SESSION. Akibatnya suatu variabel apa saja yang didefinisikan dapat dengan mudah diisi dengan nilai dari varibel GET atau POST. Kelemahan biasanya muncul ketika digunakan varibel untuk parameter fungsi include(), require() atau fopen(). Dengan fungsi tersebut dapat dilakukan eksekusi/parsing file PHP dari file lain, baik pada file dari disk local atau file dari situs lain. Jika varibel untuk parameter fungsi tersebut diketahui,maka attacker dapat mengganti nilai varibel tersebut dengan mengirimkan nilai varibel lewat metode GET atau POST. Contoh dibawah ini adalah vulnerability akibat menggunakan variabel pada fungsi include(). Perhatikan kode dibawah ini : include($phpgw_info["server"]["include_root"]."/phpgwapi/phpgw_info.inc.php");
Kode tersebut tidak aman karena walaupun menggunakan varibel array, variable $phpgw_info masih dapat diganti dengan varibel GET/POST dari client atau diganti dengan
sebuah url lain misalnya http://attacker/phpgwapi/phpgw_
info.inc.php, dimana file phpgw_info.inc.php dapat berisi kode php yang dapat dieksekusi oleh server korban/victim, misalnya berupa kode :
Abd.Thalib - 23202112
Kejadian seperti diatas, dimana suatu kode php dari situs lain diambil agar dieksekusi di server korban sering disebut Cross Site Scripting (XSS). Ada beberapa langkah untuk menghindari penggunaan variabel global saat mengakses file, yaitu : ▪
Hindari penggunaan variabel sebagai nama file. Variabel $lib_dir di atas bisa diganti dengan sebuah nilai yang didefinisikan oleh PHP yaitu fungsi define.
▪
Cek apakah nama file yang dibuat adalah salah satu dari nama file yang diinginkan, misalnya: $valid_pages = array ( “apage.php”
=> “”,
“another.php” => “”, “more.php”
=> “”);
if (!isset($valid_pages[$page])) { // batalkan script // sebaiknya buat pesan log di sini juga die(“Invalid request”); } ▪
jika ternyata harus menggunakan sebuah variabel dari browser, cek dahulu apakah nilai variabel menggunakan kode seperti di bawah ini:
Abd.Thalib - 23202112
if (!(eregi(“^[a-z_./]*$”, $page) && !eregi(\\.\\.,$page))) { // batalkan script // sebaiknya buat pesan log di sini juga die(“Invalid request”); } ▪
Jangan percaya variabel global untuk langkah berikutnya yang dapat menjamin variabel tidak akan digunakan untuk hal-hal yang merusak.
▪
Gunakan konfigurasi varibel allow_url_fopen dan open_basedir untuk membatasi lokasi di mana file bisa dibuka.
3. Hilangkan Karakter-Karakter Escape dalam Perintah SQL. Kesalahan umum yang terjadi adalah penggunaan nilai variabel yang disediakan oleh user atau URL dalam sebuah query SQL tanpa menghilangkan karakter-karakter khusus. Perhatikan contoh kode fragmen berikut dari sebuah skrip yang dirancang untuk mengecek kebenaran username dan password yang dimasukkan dalam halaman HTML: $query = “SELECT * FROM users WHERE username=’ “ . $username . “ ‘ AND password=’ “ . $password . “ ‘ “; // record yang memenuhi perintah di atas terdapat di suatu tempat if (record_exists($query)) { echo “Access granted”; } else { echo “Access denied”; } Perintah ini akan jalan jika pengaksesan menggunakan check.php?user name=admin&password=x. Akan tetapi, jika kode ini diakses dengan menggunakan
check.php?
username=admin&password=a%27+OR+1%3Di
%271 (dan jika magic_quotes_gpc dibuat disabled) maka password akan menjadi Password=’a’ or 1=’1’ sehingga record pengguna admin akan selalu dikembalikan berapapun nilai password. Abd.Thalib - 23202112
Permasalahan ini dapat dihilangkan secara terpisah dengan mendeklarasikan variabel magic_quotes_gpc pada file php.ini, yang berarti bahwa PHP akan menghilangkan kutipan dalam GET, POST dan data cookie (data tidak berguna, hanya membuang-buang waktu saja) yang menggunakan karakter \.. Namun demikian, magic_quotes_gpc sering dibuat disabled karena variabel ini dapat membuat kode lain menjadi aneh. Jika diberikan sebuah perintah echo $username pada kode fragmen di atas, maka setiap kemunculan karakter ‘ akan diganti oleh \’. Selanjutnya variabel magic_quotes_gpc tidak akan terlindungi dari nilai-nilai variabel yang diperoleh dari sumber-sumber seperti record basis data atau file di mana pengguna jahat kemungkinan sudah bermodifikasi selama operasi program berjalan normal. Pengguna harus betul-betul memperhatikan perintah pencarian (search) pada basis datanya. Jika pengguna menggunakan MySQL contohnya, maka pencarian ini dapat dilakukan dengan menggunakan fungsi mysql_db_query. Ada beberapa langkah untuk mengatasi karakter-karakter escape. Langkahlangkah itu adalah: ▪
Gunakan fungsi addslashes yang sudah ada atau fungsi-fungsi serupa Untuk menghindari kutipan dan backslash dalam perintah SQL dengan backslash.
▪
Aktifkan variabel magic_quotes_gpc. Variabel ini bisa membantu, tetapi jangan terlalu diandalkan. (Pengaktifan dan penggunaan addslashes akan menghasilkan kesalahan).
▪
Jika menggunakan variabel yang diharapkan mengandung angka dalam perintah SQL, yakinkan bahwa variabel-variabel itu betul-betul mengandung angka. Di sini, bisa digunakan fungsi-fungsi yang sudah dimiliki oleh PHP, di antaranya: sprintf, ereg, dan is_long untuk mengecek nilai variabel.
Abd.Thalib - 23202112
4. Hindari Upload Yang Salah File-file upload dapat rusak dari sebuah kemungkinan berbahaya yang berasal dari permasalahan variabel global yang tidak dapat dipercaya. Hal ini layak dipertimbangkan sebagai sebuah permasalahan tambahan. Saat sebuah file diuploaded, script PHP menyimpan file uploaded itu. Akan tetapi, user dapat membangun URL yang mengatur nilai variabel ini hingga menjadi nilai yang tidak diharapkan seperti /etc/passwd dan tidak akan meng-upload file. Skrip tersebut kemungkinan kemudian menyalin file itu ke sebuah lokasi atau menampilkan isi file ke user. Apa yang harus dilakukan adalah menguji semua skrip yang berhubungan dengan file upload. Pencarian dengan type=”file” mungkin bisa membantu mengidentifikasi skrip-skrip ini. Langkah-langkah perbaikan dan pengembangan dalam permasalahan ini adalah seperti beikut ini. ▪
Menggunakan versi-versi PHP terbaru yang memiliki fungsi-fungsi is_uploaded_file
dan
move_uploaded_file.
Versi
terbaru
ini
memperbolehkan pemrogram untuk menjamin bahwa fungsi-fungsi di atas bekerja dengan file-file uploaded. ▪
Jika Anda tidak yakin bahwa kode Anda akan berjalan pada versi PHP terbaru, aturlah setting konfigurasi upload_tmp_dir dan kemudian lakukan pengecekan input untuk menjamin bahwa file di mana Anda bekerja betul berada dalam direktori ini.
5. Hilangkan Karakter-Karakter Escape HTML Dalam Teks Apa yang akan terjadi jika seseorang meletakkan sebuah tag