Kerentanan berbahaya di perpustakaan Sequelize yang populer





Halo, Habr! Artikel ini akan menarik bagi mereka yang sudah menggunakan perpustakaan Sequelize atau hanya akan bekerja dengannya. Di bawah pemotongan, kami akan memberi tahu Anda bagaimana fungsionalitas operatorAliases built-in dapat berbahaya dan bagaimana menghindari kebocoran dari database Anda sendiri.



Apa itu Sequelize, di mana digunakan dan untuk apa?



Sequelize adalah pustaka ORM Node.js untuk Postgres, MySQL, MariaDB, SQLite, dan Microsoft SQL Server yang memetakan tabel dalam database dan hubungannya dengan kelas. Saat menggunakan Sequelize, kita tidak harus menulis kueri SQL, tetapi kita harus bekerja dengan data seperti objek biasa. Ini memiliki dukungan transaksional yang kuat, hubungan, pemuatan aktif dan lambat, replikasi baca, dan banyak lagi.



Apa itu operatorAliases dan apa bahayanya?



Sequelize menggunakan operator karakter secara default. Menggunakan Sequelize tanpa alias simbolik, tentu saja, meningkatkan keamanan. Meskipun kurangnya alias string membuat injeksi operator sangat tidak mungkin, kita harus selalu memvalidasi dan membersihkan input pengguna dengan benar.



Dan opsi operatorAliases itu sendiri memungkinkan Anda untuk mengatur apakah operator alias akan tersedia. Berikut contoh aktivasi dalam kode:







Saat semuanya berjalan dengan baik



Mari kita lihat kode aplikasi demo. File model user.model.js berisi: Anda







dapat melihat bahwa ada tiga field dalam tabel users, dan semuanya memiliki tipe data string.



File pengontrol auth.controller.js berisi:







Kode menggunakan metode findOne pada model Pengguna. Dan metode findOne mengembalikan baris pertama dari database sesuai dengan kondisi kueri yang diteruskan. Dalam hal ini, aplikasi menerima data nama pengguna dan kata sandi dari pengguna, menerapkannya ke kueri terhadap tabel pengguna.



Permintaan yang dibuat dalam kasus ini akan terlihat seperti ini:

SELECT `id`, `username`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` = :username AND `users`.`password` = :password LIMIT 1;







Karena ORM digunakan untuk membuat kueri, injeksi SQL sepele tidak akan berfungsi. Jika tidak ada kecocokan pengguna yang ditemukan dalam database, aplikasi akan mengembalikan kesalahan Pengguna Tidak ditemukan. Jika data masukan cocok dengan tingkat basis data, aplikasi akan membandingkan kata sandi yang dimasukkan dengan kata sandi yang disimpan dalam database, dan mengembalikan "Kata Sandi Tidak Valid!" jika tidak cocok, atau token otorisasi jika berhasil. Algoritma validasi data masukan dipilih secara khusus untuk menguji kerentanan.



Tabel akan berisi data berikut:











Otorisasi bekerja dengan benar.



Bagaimana dengan operator dan alias?









Alias ​​dilambangkan dengan simbol "$", sintaks untuk alias mirip dengan MongoDB. Operator pencarian, perbandingan, dan banyak lainnya tersedia untuk kami. Meskipun pengetikan data yang kuat dalam model, transfer data dari pengguna ke ORM dalam format JSON memerlukan normalisasi. Dan di sini kesenangan dimulai!



Saat masalah menghantam DOM



Serangan batch







Permintaan semacam ini ke aplikasi memulai permintaan ke database:

Pelaksana (default): Dengan serangan ini, Anda dapat memeriksa banyak login untuk kata sandi tertentu untuk validitas dalam satu permintaan ke server dan sebaliknya. Serangan ini bekerja di versi terbaru pustaka untuk Desember 2020 (6.3.5) dan dengan opsi operatorAliases dinonaktifkan. SELECT `id`, `username`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` IN ('admin', 'more', 'much more') AND `users`.`password` = 'wrong pass' LIMIT 1;











Serangan konversi tipe data



Jika Anda mengirimkan data seperti ...







... ke aplikasi , maka tidak ada yang akan terjadi dalam kasus kami. Meskipun kondisi logis dalam database akan benar, memeriksa kata sandi dalam aplikasi yang dipelajari di tingkat aplikasi dan membandingkan tipe data yang berbeda tidak dapat mengembalikan nilai true.



Perbandingan Serangan Operator







Menurut data pada tangkapan layar, kueri akan dibuat ke database dalam bentuk: Database mengembalikan data, karena ada kecocokan antara nama pengguna = admin dan kata sandi yang tidak sama dengan "aaa". Untuk menjalani proses otorisasi sepenuhnya, kita perlu mendapatkan kata sandi.

SELECT `id`, `username`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` = 'admin' AND `users`.`password` != 'aaa' LIMIT 1;











Serangan pencarian regex dan string



Anda bisa mendapatkan data mentah dengan menggunakan alias untuk operator penelusuran $ like atau operator $ regexp untuk bekerja dengan ekspresi reguler.







Ketika simbol tidak bertemu, kesalahan akan dilemparkan bahwa pengguna tidak ditemukan.







Jika simbolnya cocok, akan ada kesalahan tentang kata sandi yang salah. Permintaan formulir dijalankan ke dalam database: Dengan demikian, karakter demi karakter, Anda dapat memulihkan data dari tabel.

SELECT `id`, `username`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` = 'admin' AND `users`.`password` LIKE 'E%' LIMIT 1;











Serangan perbandingan kolom dalam sebuah tabel



Ada alias $ col menarik yang memungkinkan Anda membandingkan bidang dengan bidang.







Query ke database akan: Mengeksekusi query berikut ke database: Dengan demikian, akan memenuhi kondisi logis pada level database.

SELECT `id`, `username`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` = 'admin' AND `users`.`password` = `aaaaa` LIMIT 1;













SELECT `id`, `username`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` = 'admin' AND `users`.`password` = `password` LIMIT 1;









Menyingkirkan kerentanan



  • Anda perlu menginstal versi terbaru dari perpustakaan Sequalize, di mana dukungan untuk alias telah dihapus.



    ( Sumber )

  • Nonaktifkan penggunaan alias dengan menyetel operatorAliases: false.
  • Validasikan jenis data dan nilainya secara menyeluruh dari pengguna sebelum digunakan di ORM.


Terima kasih atas minat Anda!



All Articles