Kerentanan Pemotongan SQL terjadi saat database memotong input pengguna karena batas panjang. Penyerang dapat mengumpulkan informasi tentang panjang bidang penting (seperti nama pengguna) dan menggunakan informasi tersebut untuk mendapatkan akses tidak sah. Penyerang dapat masuk sebagai pengguna yang berbeda, seperti administrator, dengan kata sandi terdaftar mereka.
Kerentanan pemotongan SQL umumnya ditemukan di database MySQL. Kerentanan ini pertama kali dijelaskan di CVE-2008-4106, yang terkait dengan CMS WordPress.
Bagaimana Serangan Pemotongan SQL Bekerja
Serangan ini bekerja dengan mengurangi akses pengguna ke database menggunakan fungsi “pilih” dan “sisipkan”.
- Saat input diberikan dalam bidang formulir, fungsi pilih memeriksa redundansi terhadap entri basis data.
- Setelah memeriksa redundansi, fungsi insert memeriksa panjang masukan, dan masukan pengguna akan terpotong jika panjangnya terlampaui.
Misalkan pengembang membuat tabel “pengguna” dengan kueri berikut:
buat pengguna tabel (
user_id INT NOT NULL AUTO_INCREMENT,
nama pengguna VARCHAR(20) BUKAN NULL,
kata sandi VARCHAR(40) BUKAN NULL,
KUNCI UTAMA ( user_id )
);
Menggunakan skema ini, jika pengembang membuat akun administrator dengan:
kata sandi = “secret_p4ssw0ord”
Jelas, kredensial ini tidak bersifat publik. Hanya ada satu akun administrator di database, dan jika penyerang mencoba mendaftarkan akun lain dengan nama pengguna “admin”, penyerang akan gagal karena pemeriksaan redundansi database. Penyerang masih dapat melewati pemeriksaan redundansi tersebut untuk menambahkan akun administrator lain dengan mengeksploitasi kerentanan Pemotongan SQL. Misalkan penyerang mendaftarkan akun lain dengan input berikut:
Username = “adminxxxxxxxxxxxxxxx acak”
(x adalah spasi)
&
Password = “Pengguna Acak”
Basis data akan mengambil “nama_pengguna” (26 karakter) dan memeriksa apakah ini sudah ada. Entri nama_pengguna kemudian akan dipotong dan “admin” (dengan spasi “admin”) akan dimasukkan ke dalam basis data, menghasilkan dua pengguna admin duplikat.
Penyerang kemudian dapat membuat pengguna “admin” dengan kata sandinya sendiri. Basis data sekarang memiliki dua entri nama_pengguna administrator, tetapi dengan kata sandi yang berbeda. Penyerang dapat masuk dengan kredensial yang baru dibuat untuk mendapatkan konsol admin karena dua nama pengguna “admin” dan “admin” sama dengan tingkat basis data. Sekarang kita akan melihat contoh serangan praktis.
Contoh serangan
Dalam contoh ini, kami akan mengambil skrip dari overthewire.org. Komunitas Overthewire menyediakan CTF wargame yang dapat kami gunakan untuk menerapkan konsep keamanan kami. Skenario reduksi SQL terjadi pada game natas Level 26->27. Kita dapat mengakses level menggunakan yang berikut ini.
Nama panggilan: natas27:
Kata sandi: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Level ini tersedia di: https://overthewire.org/wargames/natas/natas27.html. Anda akan disajikan halaman login yang rentan terhadap serangan SQL Truncation.
Setelah memeriksa kode sumber, Anda akan melihat bahwa panjang nama pengguna adalah 64 seperti yang ditunjukkan di bawah ini.
Pengguna bernama “natas28” sudah ada. Tujuan kami adalah membuat pengguna lain bernama “natas28” menggunakan serangan SQL_truncation. Jadi kita akan mengetik natas28 diikuti dengan 57 spasi dan alfabet acak (a dalam kasus kita), nama pengguna dan kata sandi apa saja. Huruf “a” tidak terlihat di tangkapan layar karena nama pengguna 65 karakter. Setelah membuat akun pengguna, Anda akan dapat melihat “A.
Jika database berisi kerentanan sql_truncation, database sekarang harus memiliki dua nama pengguna “natas28”. Satu nama pengguna akan berisi kata sandi kita. Mari kita coba memasukkan kredensial di halaman login.
Sekarang kita login sebagai user “natas28”.
Mitigasi
Untuk mengurangi serangan ini, kita perlu mempertimbangkan banyak faktor.
- Kami tidak boleh mengizinkan duplikasi identitas penting seperti nama pengguna. Kita perlu menjadikan identitas ini kunci utama.
- Fungsi truncate harus diimplementasikan untuk semua bidang formulir front-end serta kode back-end sehingga database menerima entri terpotong.
- Mode ketat harus diaktifkan di tingkat basis data. Tanpa mengaktifkan mode ketat, database hanya mengeluarkan peringatan di latar belakang, tetapi mempertahankan data yang dicadangkan. Basis data dalam mode ketat memberikan kesalahan pada replikasi dan menghindari penyimpanan data.
Misalnya, mari kita uji mode ketat menggunakan kueri berikut:
Kami akan membuat database dan tabel “pengguna”.
Kueri Oke, 1 baris terpengaruh (0,02 dtk)
mysql> Gunakan tes
Basis data telah berubah
mysql> CREATE TABLE pengguna (nama pengguna VARCHAR(10), kata sandi VARCHAR(10));
Kueri Oke, 0 baris terpengaruh (0,05 dtk)
Selanjutnya, kita akan membuat pengguna admin dengan kredensial menggunakan kueri INSERT.
Kueri Oke, 1 baris terpengaruh (0,01 detik)
Kita dapat melihat informasi tabel ‘pengguna’ menggunakan opsi ‘pilih * dari pengguna’.
Nama pengguna panjangnya 10 karakter. Sekarang kita akan mencoba serangan pemotongan SQL.
Saat kami mencoba mengetik yang berikut ini:
(x adalah spasi)
&
Kata Sandi = ‘pass2’
Kami akan mendapatkan kesalahan, yang berarti mode ketat sepenuhnya efektif.
KESALAHAN 1406 (22001). Data terlalu panjang untuk kolom ‘nama pengguna’ di baris 1
Tanpa mengaktifkan mode ketat, database akan mengeluarkan peringatan tetapi masih memasukkan data ke dalam tabel.
Kesimpulan
Penyerang dapat memperoleh akses ke akun yang sangat istimewa jika aplikasi Anda memiliki kerentanan sql_trunction. Penyerang dapat dengan mudah memperoleh informasi nama pengguna dan panjang basis data menggunakan bidang kritis dan kemudian membuat nama pengguna yang sama diikuti dengan spasi dan alfabet acak setelah panjang minimum, menghasilkan pembuatan beberapa akun dengan hak tinggi. Kerentanan ini sangat penting, tetapi dapat dihindari jika Anda melakukan beberapa tindakan pencegahan keamanan, seperti mengaktifkan mode masukan pengguna yang ketat dan menjadikan bidang sensitif di database sebagai kunci utama.