Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Suntikan SQL dengan mengganti kutipan tunggal dan memvalidasi bilangan bulat

Jika ini adalah proyek warisan yang dikodekan dengan cara ini, meskipun tidak optimal, saat ini saya tidak mengetahui cara apa pun yang dapat rentan terhadap injeksi SQL selama setiap string diperlakukan dengan cara itu dan kuerinya sederhana yang seperti yang telah Anda tunjukkan.

Namun saya tidak bisa menyatakan kepastian lebih dari itu. Tanpa menggunakan kueri parametris, selalu ada kemungkinan bahwa ada beberapa kerentanan yang belum Anda pertimbangkan.

Melarikan diri secara manual dari tanda kutip sendiri rawan kesalahan dan terkadang bisa gagal dengan cara yang sulit diantisipasi sebelumnya. Misalnya dengan tabel berikut

CREATE TABLE myTable(title VARCHAR(100))
INSERT INTO myTable VALUES('Foo')

Dan prosedur tersimpan menggunakan SQL dinamis yang dibangun dengan rangkaian string

CREATE PROC UpdateMyTable
@newtitle NVARCHAR(100)
AS
/*
Double up any single quotes
*/
SET @newtitle = REPLACE(@newtitle, '''','''''')

DECLARE @UpdateStatement VARCHAR(MAX)

SET @UpdateStatement = 'UPDATE myTable SET title='''  + @newtitle + ''''

EXEC(@UpdateStatement)

Anda dapat mencoba yang berikut

Pembaruan biasa

EXEC UpdateMyTable N'Foo'
SELECT * FROM myTable /*Returns "Foo"*/

Upaya Injeksi SQL digagalkan

EXEC UpdateMyTable N''';DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "';DROP TABLE myTable--"*/

Upaya SQL Injection berhasil dan menjatuhkan tabel

EXEC UpdateMyTable N'ʼ;DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "Invalid object name 'myTable'."*/

Masalahnya di sini adalah bahwa kueri ketiga melewati U+02BC alih-alih apostrof standar dan kemudian string ditetapkan ke varchar(max) setelah sanitasi terjadi yang secara diam-diam mengubah ini menjadi tanda kutip biasa.

Sampai saya membaca jawabannya di sini masalah itu tidak akan pernah terpikir oleh saya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara meneruskan variabel yang berisi daftar ke kueri SQL dinamis?

  2. Menjalankan prosedur tersimpan yang dijadwalkan pada SQL server

  3. Keluar dari string di SQL Server sehingga aman digunakan dalam ekspresi LIKE

  4. Apa yang bisa menjadi cara yang baik untuk menyebarkan Aplikasi Web ASP.Net?

  5. SQL UPDATE tidak berfungsi dengan bahasa asing (Arab)