joe@learnsecurityonline.com
http://twitter.com/j0emccray
http://www.linkedin.com/in/joemccray
Machine Translated by Google
alias:
Orang kulit hitam di konferensi keamanan
Machine Translated by Google
• saya meretas
• aku mengutuk
•
SAYA MINUM (Rum & Coke)
Machine Translated by Google
3 Kelas SQLI
SQL Injection dapat dipecah menjadi 3 kelas
Inband - data diekstraksi menggunakan saluran yang sama yang digunakan untuk menyuntikkan kode SQL.
Ini adalah jenis serangan yang paling mudah, di mana data yang diambil disajikan langsung di halaman
web aplikasi
Out-of-Band - data diambil menggunakan saluran yang berbeda (misalnya: email dengan hasil kueri dibuat dan
dikirim ke penguji)
Inferensial - tidak ada transfer data yang sebenarnya, tetapi penguji dapat merekonstruksi informasi
dengan mengirimkan permintaan tertentu dan mengamati perilaku yang dihasilkan dari situs web/Server DB.
Machine Translated by Google
Masuk:
Data diekstraksi menggunakan saluran yang sama yang digunakan untuk menyuntikkan
kode SQL.
Ini adalah jenis serangan yang paling mudah, di mana data yang diambil disajikan langsung
di halaman web aplikasi
Jadi ini adalah Injeksi SQL Berbasis Kesalahan dan Berbasis Serikat kami
Kesalahan sintaks mengubah nilai nvarchar '[j0e]' ke kolom tipe data int.
Machine Translated by Google
Di luar band:
Data diambil menggunakan saluran yang berbeda (misalnya: email dengan
hasil kueri dibuat dan dikirim ke penguji).
Ini adalah cara lain untuk mengeluarkan data dari server (seperti http, atau dns).
Inferensial:
Jika aplikasi mengembalikan pesan kesalahan yang dihasilkan oleh kueri yang
salah, maka mudah untuk merekonstruksi logika kueri asli dan oleh karena itu
memahami cara melakukan injeksi dengan benar.
http://[site]/page.asp?id=1;if+not(select+system_user)+<>+'sa'+waitfor+delay+'0:0:10'--
Tanyakan apakah itu berjalan sebagai 'sa'
Machine Translated by Google
Johnny Pejalan
Machine Translated by Google
Johnny Pejalan
Gabung
kalau tidak
login ditolak
Machine Translated by Google
Johnny Pejalan
Gabung
kalau tidak
login ditolak
Machine Translated by Google
Ya mereka ...... hanya sadar akan Jenis Injeksi SQL yang berbeda ....
Machine Translated by Google
(berdasarkan kesalahan)
Joe, saya muak dengan omong kosong ini, apa yang Anda maksud dengan berbasis kesalahan, buta, dan persatuan?
Machine Translated by Google
Kesalahan:
Mengajukan pertanyaan kepada DB yang akan menyebabkan kesalahan, dan mengumpulkan informasi dari
kesalahan.
Persatuan:
SQL UNION digunakan untuk menggabungkan hasil dari dua atau lebih SELECT SQL
Buta:
Mengajukan pertanyaan benar/salah kepada DB dan menggunakan apakah halaman yang valid dikembalikan atau tidak, atau
dengan menggunakan waktu yang dibutuhkan halaman valid Anda untuk kembali sebagai jawaban atas pertanyaan tersebut.
Machine Translated by Google
Metodologi saya
Bagaimana saya menguji SQL Injection
Mengenali
* Identifikasi Injeksi (Alat atau Manual)
*
Tentukan Jenis Injeksi (Bilangan bulat atau String)
Menyerang
*
Injeksi SQL Berbasis Kesalahan (Termudah)
*
Injeksi SQL Berbasis Serikat (Bagus untuk ekstraksi data)
*
Injeksi SQL Buta (Kasus terburuk .... pilihan terakhir)
Machine Translated by Google
- Dapatkah Anda memahami mengapa dapat menguji SQLI secara manual itu penting?
Integer Integer:
http://[site]/page.asp?id=1 memiliki 1=1--
Kolom '[NAMA KOLOM]' tidak valid dalam daftar pilihan karena tidak
terdapat dalam fungsi agregat dan tidak ada klausa GROUP BY.
Injeksi String:
http://[site]/page.asp?id=x' memiliki 1=1--
Kolom '[NAMA KOLOM]' tidak valid dalam daftar pilihan karena tidak
terdapat dalam fungsi agregat dan tidak ada klausa GROUP BY.
'
atau tidak.
Menentukan inilah yang menentukan apakah Anda membutuhkan
Machine Translated by Google
Saya akan mengatakan bahwa MS-SQL Injection mungkin yang paling menyenangkan ;)
Kami akan menghabiskan sedikit waktu di MySQL, dan tidak terlalu banyak waktu di
Oracle karena sintaks injeksinya cukup mirip dengan MS-SQL. Tapi terutama demi waktu
kita akan fokus pada MS-SQL.
Machine Translated by Google
Kesalahan sintaks mengubah nilai nvarchar '[DB USER]' ke kolom tipe data int.
Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.
Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.
Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.
3 - Jumlah Karakter
D - Karakter Pertama
B - Karakter ke-2
http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),2,1)))>97) WAITFOR DELAY
'00:00:10'-- Halaman yang valid segera kembali
O - Karakter ke-3
http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),3,1)))>97) WAITFOR DELAY '00:00:10'-- Halaman yang valid segera
kembali
.....dan seterusnya
* Berbasis Serikat
* Buta
Machine Translated by Google
MySQL
Dengan MySQL Anda biasanya akan menggunakan SQL Injection union atau true/false
blind sehingga Anda benar-benar perlu tahu banyak tentang DB yang Anda serang seperti:
* jumlah kolom
* nama kolom
*
jalan ke situs web
Operator UNION digunakan untuk menggabungkan kumpulan hasil dari dua atau lebih
pernyataan SELECT. Perhatikan bahwa setiap pernyataan SELECT dalam UNION harus me
jumlah kolom yang sama. Kolom juga harus memiliki tipe data yang serupa.
Juga, kolom di setiap pernyataan SELECT harus dalam urutan yang sama.
Machine Translated by Google
http://[site]/page.php?id=1 order by 6/* <- memberikan kolom Unknown '6' di 'order clause'
Membangun serikat
http://[site]/page.php?id=1 union all pilih 1,2,3,4,5/* <-- memberikan halaman yang valid
Ubah bagian pertama kueri ke nilai nol atau negatif sehingga kami dapat melihat bidang apa yang
akan mengembalikan data kepada kami.
http://[site]/page.php?id=-1 union all select 1,2,3,4,5/* <-- memberikan halaman yang valid tetapi dengan
nomor 2, dan 3 di atasnya
atau
http://[site]/page.php?id=null union all select 1,2,3,4,5/* <- memberikan halaman yang valid tetapi
dengan nomor 2, dan 3 di atasnya
Sekarang kita tahu bahwa kolom nomor 2 dan 3 akan menggemakan data kembali kepada kita.
Machine Translated by Google
Membangun serikat
http://[site]/page.php?id=null union semua pilih 1,2,3,4,5,6,7/*
Pengumpulan Informasi
Tidak Tertangkap
Machine Translated by Google
Filter Evasion
Saya tahu bahwa orang sering berpikir hal ini sangat hitam dan putih, dipotong dan kering -
tetapi kebenaran sederhana dengan injeksi sql kadang-kadang Anda hanya memiliki firasat
bahwa Anda sedang melihat halaman yang rentan.
Anda telah mencoba banyak hal tetapi untuk beberapa alasan sepertinya tidak ada yang berhasil.
Anda mungkin menghadapi semacam penyaringan. Mungkin pengembang telah mencoba
menghentikan injeksi sql dengan hanya mengizinkan karakter alfanumerik sebagai input.
Machine Translated by Google
Hal pertama yang ingin kita lakukan adalah menentukan apakah pemfilteran adalah sisi klien (mis:
dilakukan dengan javascript).
Lihat kode sumber dan cari parameter apa pun yang diteruskan ke situs web yang dapat difilter
dengan javascript/vbscript dan hapus
Di sini kita melakukan “atau benar”, meskipun kali ini kita menggunakan
perbandingan “suka” alih-alih tanda “=”. Kita bisa menggunakan teknik yang sama
untuk varian lain seperti “and 1 like 1” atau “and 1 like 2”
Dengan IPS Anda dapat menggunakan sesuatu seperti Deteksi Filter Aktif atau Anda dapat mencoba
sesuatu yang BENAR-BENAR berisik dari alamat IP lain untuk melihat apakah IP Anda diblokir.
Bergantung pada ruang lingkup keterlibatan Anda, Anda mungkin atau mungkin tidak benar-benar dapat
mengidentifikasi kapan IDS digunakan karena sifatnya pasif.
Sejujurnya saya menemukan sisi rumah ini menjadi lebih banyak bukti konsep, dan hanya bersenang-
senang sebagai lawan dari sesuatu yang sebenarnya saya butuhkan dalam penilaian.
Machine Translated by Google
Machine Translated by Google
Menjawab:
Ini bagus untuk alat otomatis dan anak-anak
Machine Translated by Google
Menjawab:
Sekali lagi, ini bagus untuk alat otomatis dan anak-anak
Machine Translated by Google
Signature 3-5
IDS Berbasis Tanda Tangan (3-5)
alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg: “SQL Injection SELECT statement”;
flow: to_server, didirikan; pcre:”/select.*from.*(\-\-|\/\* |\#)/i”; sid: 2; rev: 1;)
alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg: “pernyataan SQL Injection
UNION”; aliran: to_server, didirikan; pcre:”/union.*(\-\-|\/\*|\#)/i” ; sid: 3; putaran: 1;)
Signature 7
alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg: “SQL Injection SELECT statement”; flow: to_server, map; pcre:”/(s|%73|%53)(e|
%65|%45) (l|%6C|%4C)(e|%65|%45)(c|%63|%43)(t|%74|%45).*(f|%66|%46)(r| %72|%52)(o| %6F|%4F)(m|%6D|%4D).*(\-\-|\/\*|\#)/i”; sid: 2; rev: 3 ;)
Setidaknya tanda tangan 7 memperhitungkan sensitivitas huruf besar/kecil dengan pengkodean hex.
Tetapi.....
Anda harus memastikan bahwa serangan Anda benar-benar berfungsi. Sangat mudah untuk melewati IDS, tetapi
Anda dapat dengan mudah berakhir dengan serangan Anda melewati IDS, tetapi tidak berfungsi sama sekali.
Dengan mengingat hal ini, Anda dapat mencampur/mencocokkan trik penghindaran IDS - ini hanya masalah
memahami regex yang digunakan.
http://[site]/page.asp?id=2%20or%202%20in%20(/*IDS*/%73/*evasion*/%65/*is*/
%6C/*mudah*/%65/*hanya*/%63/*minta*/%74/*j0e*/%20%75/*kepada*/%73/*ajar*/%65/*kamu* /
%72/*bagaimana*/)%2D%2D
Halo @ Saya....
Anda ingin presentasi?????
Surel: joe@learnsecurityonline.com
Twitter: http://twitter.com/j0emccray
LinkedIn: http://www.linkedin.com/in/joemccray