Software Security - SQL Injection
Tujuan dari Serangan SQL Injection
Mengidentifikasi parameter injeksi
Penyerang ingin menyelidiki Aplikasi Web untuk menemukan mana parameter dan bidang-input pengguna rentan terhadap SQLIA.
Tujuan dari serangan ini adalah untuk menambah atau mengubah informasi dalam database.
- Menggali data pada sebuah web
Jenis-jenis serangan
menggunakan teknik yang akan mengekstrak nilai data dari database.
Tergantung pada jenis dari aplikasi Web, informasi ini bisa menjadi
sensitif dan sangat diinginkan untuk penyerang. Serangan dengan maksud
ini adalah Jenis yang paling umum dari SQLIA.
- - Melakukan nya di Denial of Service (DoS)
Serangan ini dilakukan
untuk menutup database dari aplikasi Web, sehingga menyangkal layanan ke
pengguna lain. Serangan yang melibatkan mengunci atau menjatuhkan tabel
database juga termasuk dalam kategori ini.
- - Menghindari deteksi
Kategori ini mengacu
pada teknik serangan tertentu yang digunakan untuk menghindari audit dan
deteksi oleh system mekanisme perlindungan.
- - Melewati Authentication (bukti keaslian)
Tujuan dari jenis
serangan adalah untuk memungkinkan penyerang untuk memotong otentikasi
database dan aplikasi mekanisme. Melewati mekanisme seperti itu bisa
memungkinkan penyerang untuk menganggap hak dan hak istimewa yang
berkaitan dengan yang lain pengguna aplikasi.
- - Mengeksekusi perintah Jarak jauh
Jenis serangan berusaha
untuk mengeksekusi perintah sewenang-wenang pada database.
Perintah-perintah ini dapat disimpan prosedur atau fungsi yang tersedia
bagi pengguna database.
- - Melakukan ekskalasi/perintah hak Istimewa
Serangan ini memanfaatkan kesalahan implementasi atau kekurangan logis dalam database untuk meningkatkan
hak-hak istimewa dari penyerang. Berbeda dengan melewati otentikasi
serangan, serangan ini fokus pada pemanfaatan database hak pengguna.
Metode Injeksi Memasukan Source
a. Melakukan Injeksi melalui inputan pengguna
1. Melalui URL Get
http://situskorban/artikel.php?id=10
URL
di atas memiliki parameter id dan biasanya diikuti dengan angka
tertentu. Angka ini menunjukkan nomor id dari artikel yang sedang
tampil.
Hanya
dengan menambahkan beberapa query SQL di belakang parameter tersebut,
seorang hacker mampu mengakses database yang digunakan oleh situs
tersebut. Berikut ini salah satu contoh query yang diinjectkan melalui
URL berparameter
http://situskorban/artikel.php?id=10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
Seorang
hacker dalam melancarkan aksinya, biasanya butuh beberapa kali submit
URL dan query sebelum akhirnya mendapatkan targetnya.
Nah…
sekarang saya akan paparkan sedikit tentang bagaimana menghindari
injection seperti halnya di atas. Point pentingnya di sini adalah
bagaimana supaya parameter hanya bisa membaca nomor unik id dari
artikelnya saja, dengan mengabaikan query yang disisipkan hacker. Atau
dengan kata lain bagaimana supaya parameter yang berisi query injection
dihilangkan, misal apabila diberikan URL berikut ini:
http://situskorban/artikel.php?id=10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
akan menjadi:
http://situskorban/artikel.php?id=10
(bagian ‘union all select 1,concat(user,0x3a,pass,0x3a,email) from users –’ diabaikan)
Untuk
menghilangkan query yang disisipkan pada parameter dalam URL, kita bisa
menggunakan ‘teknik casting’. Dalam hal ini, kita mengcasting nilai
parameter ke dalam tipe data integer. Sebagai contoh, misalkan kita
memiliki sebuah string id = ’10 union all select
1,concat(user,0x3a,pass,0x3a,email) from users –’. Apabila id ini
dicasting ke dalam integer maka akan dihasilkan id = 10, dengan cara
memberikan perintah id = (int) $id.
Script di atas akan menghasilkan 10.
Nah…
pada URL http://situskorban/artikel.php?id=…, biasanya dalam script
artikel.php ini, pastilah di dalamnya terdapat perintah berikut
Perintah
$id = $_GET['id']; digunakan untuk membaca nilai parameter id-nya untuk
kemudian ditampilkan artikelnya berdasarkan id tersebut. Nah.. teknik
casting di atas dapat diterapkan pada script artikel.php ini
Lebih baik lagi, kalau kita tambahkan function absolut abs()
Mengapa
perlu ditambahkan abs()? ya… karena ada pula teknik SQL injection yang
memanfaatkan ‘negative number’ pada parameter URLnya, misalkan:
http://situskorban/artikel.php?id=-10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
Di sini, function abs() hanya untuk menjamin saja bahwa nilai parameter id adalah bernilai positif.
2. Melalui Input field POST
Jenis
ini tidak lah jauh berbeda dengan jenis GET(method), bedanya hanya
terletak pada nama hhehehe GET dan POST, pada dasarnya method POST
berasal dari variable yang ada pada form, contohnya seperti form login
atau form pencarian, cara untuk mengindetifikasinya juga sama, dengan
memberikan karakter ' atau - atau karakter ascii yang bisa menghasilkan
error, tetapi terkadang perbedaan terletak pada operan (operator) yang
ada, jika pada login form (form login) kita bisa menggunakan perintah
seperti yang telah kita uraikan di atas, yaitu menjadikan SQL itu
bernilai true, seperti
1' OR 1=1--
' OR 100=100#
SQL yang terjadi akan seperti berikut
select * from user where username='1' OR 1=1-- and password='$password'
selecct * from user where username='' OR 100=100# and password='$password'
yang
terpenting menjadikannya TRUE, sedangkan pada kasus yang lain, seperti
form pencarian, pada form pencarian biasanya query yang terjadi pada
RDMS cukup komplesk, menggunakan operan LIKE OR atau AND, kadang-kadang
ini bisa menjadi masalah untuk kita, misalnya query yang ada seperti
berikut
select * from mahasiswa where nim like '%123%' OR nama like '%indonesia%'
pertanyaanya
bagaiaman membuat atau memanipulasi query tersebut bernilaio true ? ,
sebenarnya cukup simple, kita hanya perlu memanipulasi operan LIKE '% %'
bernilai true, misalnya dengan perintah2 berikut pada form search
123%'#
123%'--
maka query yang terjadi adalah
select * from mahasiswa where nim like '%123%'#%' OR nama like '%indonesia%'
select * from mahasiswa where nim like '%123%'--%' OR nama like '%indonesia%'
jika
kita lebih jauh mengexploitasinya tidak lah berbeda dengan GET method,
hanya berbeda pada bagian depanya saja, misalnya seperti
123%' order by 4#
atau
123%' order by 4--
maka query yang terjadi seperti berikut
select * from mahasiswa where nim like '%123%' order by 4#%' OR nama like '%indonesia%'
select * from mahasiswa where nim like '%123%' order by 4--%' OR nama like '%indonesia%'
lebih advanced
select * from mahasiswa where nim like '%123%' union select 1,2,3,4#%' OR nama like '%indonesia%'
atau
select
* from mahasiswa where nim like '%123%' union select
unhex(hex(1)),unhex(hex(2)),unhex(hex(3)),unhex(hex(4))#%' OR nama like
'%indonesia%'
atau
select * from mahasiswa where nim like '%123%'/**/union/**/select/**/1,/**/2,/**/3,/**/4#%' OR nama like '%indonesia%'
b. Injeksi melalui Cookies
Yaitu dengan memodifikasi sebuah cookies field yang mengandung SQLIA (SQL Injection Attack). Cookie
adalah file yang berisi Negara informasi yang dihasilkan aplikasi byWeb
dan disimpan pada klien mesin. Ketika klien kembali ke aplikasi Web,
cookie dapat digunakan untuk mengembalikan informasi negara klien.
Karena klien memiliki kontrol atas penyimpanan cookie, klien bisa
berbahaya mengutak-atik isi cookie. Jika aplikasi Web menggunakan isi
cookie untuk membangun query SQL, seorang penyerang bisa dengan mudah
mengirimkan serangan oleh embedding dalam cookie.
c. Injeksi melalui Variable Server
Yaitu
dengan memanipulasi sebuah headers yang mengandung String SQLIA .
Variabel Server koleksi variabel yang berisi HTTP, header jaringan, dan
lingkungan variabel. Aplikasi web menggunakan variabel server berbagai
cara, seperti penebangan statistik penggunaan dan mengidentifikasi
menelusuri tren. Jika variabel ini masuk ke database tanpa sanitasi, ini
bisa membuat SQL injection kerentanan .Karena penyerang bisa membina
nilai-nilai yang ditempatkan di HTTP dan header jaringan, mereka dapat
memanfaatkan celah ini dengan menempatkan SQLIA langsung ke header.
Ketika query untuk log server variabel dikeluarkan ke database, serangan
di header palsu adalah kemudian memicu.
d. Injeksi Perintah Kedua
Dalam
suntikan orde kedua, penyerang benih input berbahaya ke dalam sistem
atau database untuk secara tidak langsung memicu SQLIA ketika masukan
yang digunakan di lain waktu. Tujuanserangan semacam ini berbeda secara
signifikan dari biasa (misalnya, firstorder) serangan injeksi. Suntikan
orde kedua tidak mencoba untuk menyebabkan serangan terjadi ketika input
berbahaya awalnya mencapai database. Sebaliknya, penyerang bergantung
pada pengetahuan tentang manamasukan akan kemudian digunakan dan
kerajinan serangan mereka sehingga terjadi selama penggunaan itu. Untuk
memperjelas, kami menyajikan contoh klasik dari urutan kedua serangan
injeksi (diambil dari [1]). Dalam contoh ini, seorang pengguna mendaftar
pada sebuah situs web dengan menggunakan nama pengguna unggulan,
seperti sebagai "admin" - ". Aplikasi ini benar lolos single mengutip
pada input sebelum menyimpannya dalam database, mencegah nya efek
berpotensi berbahaya. Pada titik ini, pengguna memodifikasi nya atau
password-nya, sebuah operasi yang biasanya melibatkan (1) memeriksa
bahwa pengguna mengetahui password saat ini dan (2) mengubah password
jika cek tersebut berhasil.
- Frekuensi dasar berbasis Aplikasi Utama
- Frekuensi dasar berbasis Aplikasi Kedua
- Aplikasi pendukung Sekunder
- Aplikasi pengajuan mengalir
Serangan tidak terjadi ketika pertama kali mencapai database, tapi ketika digunakan di kemudian hari.
Input: admin' - ===> admin \ '-
querystring =
"Pengguna UPDATE SET pin =" + + newPin
"MANA userName = '" + username + "' AND pin =" + oldPin;
querystring =
"Pengguna UPDATE SET pin = '0 '
MANA userName = 'admin' -' DAN pin = 1 ";
Type Serangan SQL Injection
a. SQL Injection Attack Classic
- Piggy-backed Queries
Masukkan pertanyaan tambahan yang akan dieksekusi oleh database.
querystring = "Info SELECT DARI MANA usertable" +
"Login = '" + + Login "' AND pin =" + pin;
Masukan pin sebagai "0; DROP webapp Database"
querystring = "Info SELECT DARI MANA usertable
login = 'nama' DAN pin = 0; DROP webapp Database "
- Tautologies
Buat query yang selalu mengevaluasi untuk benar untuk entri dalam database.
querystring = "Info SELECT DARI MANA usertable" +
"Login = '" + + Login "' AND pin =" + pin;
Masukan login sebagai "user 'atau 1 = 1 -"
querystring = "Info SELECT DARI MANA usertable
login = 'user' atau 1 = 1 - 'DAN pin = "
- Encodings Alternatif
Encode serangan sedemikian rupa untuk menghindari masukan naif penyaringan.
querystring = "Info SELECT DARI MANA usertable" +
"Login = '" + + Login "' AND pin =" + pin;
Masukan pin sebagai "0; declare @ char (20) pilih
@ a = 0x73687574646f776e exec (@ a) "
"SELECT Info DARI MANA usertable
login = 'user' DAN pin = 0;
menyatakan @ char (20) pilih @ a = 0x73687574646f776e exec (@ a) "
- Illegal / Logically Incorrect Queries
Tujuan:
- mengumpulkan informasi tentang jenis dan struktur dari database
back-end dari aplikasi Web. Penyebab sintaks, jenis konversi, atau
kesalahan logis ke dalam database.
- Jika penyerang menyuntikkan teks berikut ke bidang masukan pin:
"Mengkonversi (int, (pilih atas 1 nama dari sysobjects mana xtype = 'u'))".
Yang dihasilkan query:
SELECT
akun FROM pengguna WHERE login ='' DAN pass ='' DAN pin = convert (int,
(pilih atas 1 nama dari sysobjects mana xtype = 'u'))
- UNION SQLIA
Tujuan:
untuk melewati Otentikasi, penggalian data. Mengembalikan sebuah
dataset yang adalah gabungan dari hasil asli pertama query dan hasil
query disuntikkan.
-
Seorang penyerang bisa menyuntikkan teks "'UNION SELECT CARDNO dari
creditcards mana acctNo = 10032 -" ke dalam kolom login, yang
menghasilkan query berikut:
SELECT akun FROM pengguna WHERE login ='' UNION
SELECT CARDNO dari creditcards mana acctNo = 10032 - DAN pass ='' DAN pin =
- Stored Procedures SQLIA
Tujuan : Melakukan penolakan layanan, mengeksekusi perintah remote.
Menyebabkan database untuk menutup.
Menyuntikkan "'; SHUTDOWN, -" menjadi baik ladang userName atau password.
Suntikan ini menyebabkan prosedur yang tersimpan untuk menghasilkan query berikut:
SELECT akun FROM pengguna WHERE login = 'doe' DAN lulus = ''; SHUTDOWN, - DAN pin =
b. Gangguan dari SQL Injection Attack
Mempunyai
Tujuan yaitu : Mengidentifikasi parameter suntik, penggalian data,
menentukan skema database. Query dimodifikasi akan dieksekusi
berdasarkan jawaban untuk pertanyaan benar / salah.
Mempunyai 2 Teknik yaitu :
a. Classic Blind Injection
b. Timing Attack
- Classic Blind
Blind SQL Injection digunakan ketika sebuah aplikasi web yang rentan
terhadap SQL injection tetapi hasil injeksi tidak terlihat penyerang.
Halaman dengan kerentanan mungkin tidak menjadi salah satu yang
menampilkan data tetapi akan ditampilkan berbeda tergantung pada hasil
dari pernyataan logis disuntikkan ke pernyataan SQL yang sah disebut
untuk halaman tersebut. Jenis serangan dapat menjadi waktu-intensif
karena pernyataan baru harus dibuat untuk setiap bit pulih. Ada beberapa
alat yang dapat mengotomatisasi serangan ini sekali lokasi kerentanan
dan informasi target telah ditetapkan.
- Conditional Response / Kondisi Respon
Salah
satu jenis SQL injection memaksa database untuk mengevaluasi pernyataan
logis pada layar aplikasi biasa. Sebagai contoh, sebuah situs web
review buku menggunakan string query untuk menentukan resensi buku untuk
menampilkan. Jadi URL http://books.example.com/showReview.php?ID=5 akan
menyebabkan server untuk menjalankan query.
“SELECT * FROM WHERE ID = bookreviews '5 ';”
dari
mana ia akan mengisi halaman review dengan data dari review dengan ID
5, disimpan dalam bookreviews tabel. Permintaan terjadi sepenuhnya pada
server, pengguna tidak tahu nama-nama database, tabel, atau field, juga
tidak pengguna tahu string query. Pengguna hanya melihat bahwa URL di
atas mengembalikan resensi buku. Seorang hacker dapat memuat URL
http://books.example.com/showReview.php?ID=5 DAN 1 = 1 dan
http://books.example.com/showReview.php?ID=5 DAN 1 = 2, yang dapat
mengakibatkan query
SELECT * FROM WHERE ID = bookreviews '5 'DAN '1' = '1 ';
SELECT * FROM WHERE ID = bookreviews '5 'DAN '1' = '2 ';
masing-masing.
Jika review beban asli dengan "1 = 1" URL dan halaman kosong atau
kesalahan dikembalikan dari "1 = 2" URL, situs ini mungkin rentan
terhadap serangan injeksi SQL. Hacker dapat melanjutkan dengan query
string dirancang untuk mengungkapkan nomor versi MySQL yang berjalan
pada server: http://books.example.com/showReview.php?ID=5 DAN substring
(@ @ version, 1,1) = 4, yang akan menampilkan bedah buku pada server
yang menjalankan MySQL 4 dan halaman kosong atau kesalahan sebaliknya.
Hacker dapat terus menggunakan kode dalam string query untuk
mengumpulkan informasi lebih lanjut dari server sampai jalan lain
serangan ditemukan atau tujuan nya tercapai.
- Conditional Errors / Kondisi Kesalahan
- Out-Of-Band Channeling
- Timing SQLIA
Jenis
injeksi SQL buta bergantung pada database berhenti untuk jumlah waktu
tertentu, kemudian kembali hasil, menunjukkan sukses mengeksekusi query
SQL. Dengan menggunakan metode ini, penyerang menyebutkan setiap huruf
dari potongan yang diinginkan data menggunakan logika berikut:
Jika huruf pertama dari nama database pertama adalah 'A', tunggu selama 10 detik.
Jika huruf pertama dari nama database pertama adalah 'B', tunggu selama 10 detik. dan lain-lain
Microsoft SQL Server
http://www.site.com/vulnerable.php?id=1 'waitfor delay '00: 00:10' -
MySQL
SELECT IF (ekspresi, true, false)
Menggunakan beberapa waktu pengambilan operasi misalnya Benchmark (), akan menunda respon server jika ungkapan Benar.
PATOKAN (5000000, encode ('MSG', 'oleh 5 detik'))
- Akan menjalankan fungsi encode 5000000 kali.
Tergantung
pada kinerja database server dan beban, harus mengambil hanya waktu
untuk menyelesaikan operasi ini. Yang penting adalah, dari sudut pandang
penyerang, untuk menentukan nomor tinggi cukup Benchmark () pengulangan
fungsi untuk mempengaruhi waktu respon database dengan cara yang
terlihat.
Contoh kombinasi dari kedua pertanyaan:
1
UNION SELECT IF (SUBSTRING (user_password, 1,1) = CHAR (50), Benchmark
(5000000, encode ('MSG', 'oleh 5 detik')), null) FROM pengguna WHERE
user_id = 1;
Jika
respon database butuh waktu lama, kita dapat berharap bahwa pengguna
pertama karakter password dengan user_id = 1 adalah karakter '2 '.
(CHAR (50) == '2 ')
Dengan
menggunakan metode ini untuk sisa karakter, itu mungkin untuk
menghitung seluruh password disimpan dalam database. Metode ini bekerja
bahkan ketika penyerang menyuntikkan query SQL dan isi dari halaman
rentan tidak berubah.
Jelas,
dalam contoh ini, nama-nama tabel dan jumlah kolom yang ditentukan.
Namun, mungkin untuk menebak mereka atau memeriksa dengan metode trial
and error.
Database
selain MySQL juga memiliki fungsi berbasis waktu yang memungkinkan
mereka untuk digunakan untuk serangan berbasis waktu:
WAIT MS SQL 'UNTUK DELAY '0: 0:10
PostgreSQL - pg_sleep ()
Melakukan
serangan Blind_SQL_Injection manual sangat memakan waktu, tetapi ada
banyak alat yang mengotomatisasi proses ini. Salah satunya adalah sqlmap
(http://sqlmap.sourceforge.net/) sebagian dikembangkan dalam program
hibah OWASP. Di sisi lain, alat-alat semacam ini sangat sensitif bahkan
penyimpangan kecil dari aturan. Ini termasuk:
pemindaian cluster website lain, di mana jam tidak idealnya disinkronkan,
Layanan WWW dimana metode memperoleh argumen diubah, misalnya dari / index.php? ID = 10 sampai / ID, 10.
DBMS Spesific SQLIA
- Data Base Fingerprint
Penyerang ingin menemukan jenis dan versi database yang aplikasi Web adalah
menggunakan. Beberapa jenis database yang berbeda merespon secara berbeda terhadap
query
dan serangan, dan informasi ini dapat digunakan untuk "sidik jari"
database. Mengetahui jenis dan versi database digunakan oleh aplikasi
Web memungkinkan penyerang untuk kerajinan databasespecific serangan.
- Data Base Mapping
Untuk
benar mengekstrak data dari database, penyerang seringkali perlu
mengetahui informasi skema database, seperti nama tabel, nama kolom, dan
data kolom jenis. Serangan dengan maksud ini diciptakan untuk
mengumpulkan atau menyimpulkan ini jenis informasi.
Serangan SQL yang Diperparah
- Fast-Fluxing SQLIA
Contoh kasus :
Meletakkannya,
dan memasukkannya seperti merupakan contoh yang baik dari perang
taktis, yaitu menggabungkan taktik yang berbeda demi sehingga sulit
untuk melacak dampak dari kampanye injeksi SQL tertentu. Perhatikan
contoh berikut domain dikaburkan, secara alami berada di-fluks cepat
dalam waktu injeksi SQL yang beberapa script kiddies Cina mengambil
keuntungan dari:
% 6b% 6b% 36% 2e% 75% 73 - kk6.us
% 73% 61% 79% 38% 2E% 75% 73 - s.see9.us
% 66% 75% 63% 6B% 75% 75% 2E% 75% 73 - fuckuu.us
% 61% 2E% 6B% 61% 34% 37% 2E% 75% 73 - a.ka47.us
% 61% 31% 38% 38% 2E% 77% 73 - a188.ws
% 33% 2E% 74% 72% 6F% 6A% 61% 6E% 38% 2E% 63% 6F% 6D - 3.trojan8.com
% 6D% 31% 31% 2E% 33% 33% 32% 32% 2E% 6F% 72% 67 - m11.3322.org
Seperti
biasa, obfuscations ini hanya puncak gunung es mengingat jumlah tak
terhitung obfuscations teknik URL lain yang spammer dan phisher yang
digunakan untuk mengambil keuntungan dari skala besar. Untuk saat ini,
salah satu alasan utama kita tidak melihat suntikan SQL besar
menggunakan obfuscations tersebut terutama karena fitur belum
diimplementasikan dalam populer SQL injector untuk peniru script kiddies
untuk mengambil keuntungan dari. Namun, dengan potensi untuk
menghindari pendekatan deteksi umum, itu hanya masalah kemauan pribadi
bagi seseorang untuk menambahkan lapisan tambahan ini untuk memastikan
survivability kampanye.
Orang-orang
di balik obfuscations ini alami multitasking di beberapa bidang tanah
yang berbeda. Ambil contoh 3.trojan8.com (58.18.33.248) juga menanggapi
w2.xnibi.com yang juga disuntikkan pada beberapa domain,
w2.xnibi.com/index.gif harus tepat. . File palsu gif dalam semangat
daftar direktori palsu untuk memperoleh lalu lintas dalam rangka untuk
melayani malware, sebenarnya mencoba untuk mengeksploitasi kerentanan
RealPlayer - JS / RealPlr.LB mengeksploitasi!. Semakin Anda pergi,
semakin buruk mendapat.
Tidak ada komentar:
Posting Komentar