Apa Itu UNION attack SQL injection - Prixleplusbas.xyz
News Update
Loading...

Jumat, 30 September 2022

Apa Itu UNION attack SQL injection

 


Ketika aplikasi rentan terhadap SQL injection dan hasil kueri dikembalikan dalam respons aplikasi, kata kunci UNION dapat digunakan untuk mengambil data dari tabel lain dalam database. Ini menghasilkan serangan UNION SQL injection.

Kata kunci UNION memungkinkan Anda menjalankan satu atau lebih kueri SELECT tambahan dan menambahkan hasilnya ke kueri asli. Sebagai contoh:


    SELECT a, b FROM table1 UNION SELECT c, d FROM table2

Kueri SQL ini akan mengembalikan satu set hasil dengan dua kolom, yang berisi nilai dari kolom a dan b di tabel1 dan kolom c dan d di tabel2.
Agar kueri UNION berfungsi, dua persyaratan utama harus dipenuhi:

  • Kueri individual harus mengembalikan jumlah kolom yang sama.
  • Tipe data di setiap kolom harus kompatibel antara kueri individual.

Untuk melakukan serangan UNION injeksi SQL, Anda perlu memastikan bahwa serangan Anda memenuhi dua persyaratan ini. Ini biasanya melibatkan mencari tahu:

Berapa banyak kolom yang dikembalikan dari kueri asli?

  • Kolom mana yang dikembalikan dari kueri asli yang merupakan tipe data yang cocok untuk menampung hasil dari kueri yang disuntikkan

Bagaimana Menentukan jumlah kolom yang diperlukan dalam serangan UNION injeksi SQL?


Saat melakukan serangan UNION injeksi SQL, ada dua metode efektif untuk menentukan berapa banyak kolom yang dikembalikan dari kueri asli. Metode pertama melibatkan menyuntikkan serangkaian klausa ORDER BY dan menambah indeks kolom yang ditentukan sampai terjadi kesalahan. Misalnya, dengan asumsi titik injeksi adalah string yang dikutip dalam klausa WHERE dari kueri asli, Anda harus mengirimkan


' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
etc.

Rangkaian payload ini memodifikasi kueri asli untuk mengurutkan hasil menurut kolom yang berbeda dalam kumpulan hasil. Kolom dalam klausa ORDER BY dapat ditentukan oleh indeksnya, jadi Anda tidak perlu mengetahui nama kolom apa pun. Ketika indeks kolom yang ditentukan melebihi jumlah kolom aktual dalam kumpulan hasil, database mengembalikan kesalahan, seperti 


    The ORDER BY position number 3 is out of range of the number of items in the select list.

Aplikasi mungkin benar-benar mengembalikan kesalahan basis data dalam respons HTTP-nya, atau mungkin mengembalikan kesalahan umum, atau tidak mengembalikan hasil apa pun. Asalkan Anda dapat mendeteksi beberapa perbedaan dalam respons aplikasi, Anda dapat menyimpulkan berapa banyak kolom yang dikembalikan dari kueri.

Metode kedua melibatkan pengiriman serangkaian muatan UNION SELECT yang menentukan jumlah nilai nol yang berbeda:

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.

Jika jumlah null tidak cocok dengan jumlah kolom, database akan mengembalikan kesalahan, seperti:

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Sekali lagi, aplikasi mungkin benar-benar mengembalikan pesan kesalahan ini, atau mungkin hanya mengembalikan kesalahan umum atau tidak ada hasil. Ketika jumlah nol cocok dengan jumlah kolom, database mengembalikan baris tambahan di kumpulan hasil, yang berisi nilai nol di setiap kolom. Efek pada respons HTTP yang dihasilkan tergantung pada kode aplikasi. Jika Anda beruntung, Anda akan melihat beberapa konten tambahan dalam respons, seperti baris tambahan pada tabel HTML. Jika tidak, nilai null mungkin memicu kesalahan yang berbeda, seperti NullPointerException. Kasus terburuk, responsnya mungkin tidak dapat dibedakan dari respons yang disebabkan oleh jumlah nol yang salah, sehingga metode penentuan jumlah kolom ini tidak efektif.

Menemukan kolom dengan tipe data yang berguna dalam serangan UNION injeksi SQL

Alasan melakukan serangan UNION injeksi SQL adalah untuk dapat mengambil hasil dari kueri yang disuntikkan. Umumnya, data menarik yang ingin Anda ambil akan berada dalam bentuk string, jadi Anda perlu menemukan satu atau beberapa kolom dalam hasil kueri asli yang tipe datanya, atau kompatibel dengan, data string.

Setelah menentukan jumlah kolom yang diperlukan, Anda dapat memeriksa setiap kolom untuk menguji apakah kolom tersebut dapat menampung data string dengan mengirimkan serangkaian muatan UNION SELECT yang menempatkan nilai string ke setiap kolom secara bergantian. Misalnya, jika kueri mengembalikan empat kolom, Anda akan mengirimkan:

' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--

Jika tipe data kolom tidak kompatibel dengan data string, kueri yang disuntikkan akan menyebabkan kesalahan basis data, seperti:
Conversion failed when converting the varchar value 'a' to data type int.
Jika kesalahan tidak terjadi, dan respons aplikasi berisi beberapa konten tambahan termasuk nilai string yang disuntikkan, maka kolom yang relevan cocok untuk mengambil data string.

Menggunakan serangan UNION injeksi SQL untuk mengambil data penting

Ketika Anda telah menentukan jumlah kolom yang dikembalikan oleh kueri asli dan menemukan kolom mana yang dapat menyimpan data string, Anda berada dalam posisi untuk mengambil data yang menarik.

Seandainya:

  • Kueri asli mengembalikan dua kolom, yang keduanya dapat menampung data string.
  • Titik injeksi adalah string yang dikutip dalam klausa WHERE.
  • Basis data berisi tabel yang disebut pengguna dengan kolom nama pengguna dan kata sandi.
Dalam situasi ini, Anda dapat mengambil konten tabel pengguna dengan mengirimkan input:

    ' UNION SELECT username, password FROM users--
Tentu saja, informasi penting yang diperlukan untuk melakukan serangan ini adalah bahwa ada tabel yang disebut pengguna dengan dua kolom yang disebut nama pengguna dan kata sandi. Tanpa informasi ini, Anda akan dibiarkan mencoba menebak nama tabel dan kolom. Faktanya, semua database modern menyediakan cara untuk memeriksa struktur database, untuk menentukan tabel dan kolom apa yang dikandungnya.

Mengambil beberapa nilai dalam satu kolom

Dalam contoh sebelumnya, anggap saja kueri hanya mengembalikan satu kolom.

Anda dapat dengan mudah mengambil beberapa nilai bersama-sama dalam satu kolom ini dengan menggabungkan nilai bersama-sama, idealnya menyertakan pemisah yang sesuai untuk memungkinkan Anda membedakan nilai gabungan. Misalnya, di Oracle Anda dapat mengirimkan input:

' UNION SELECT username || '~' || password FROM users--

Ini menggunakan urutan pipa ganda || yang merupakan operator rangkaian string di Oracle. Kueri yang disuntikkan menggabungkan nilai bidang nama pengguna dan kata sandi, dipisahkan oleh karakter ~.

Hasil dari kueri akan memungkinkan Anda membaca semua nama pengguna dan kata sandi, misalnya:

administrator~s3cure
wiener~peter
carlos~montoya

Share with your friends

Give us your opinion

Notification
This is just an example, you can fill it later with your own note.
Done