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

Bagaimana sanitasi yang lolos dari tanda kutip tunggal dikalahkan oleh injeksi SQL di SQL Server?

Ada beberapa kasus di mana fungsi escape ini akan gagal. Yang paling jelas adalah ketika satu kutipan tidak digunakan:

string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index

Dalam hal ini, Anda dapat "mendobrak" menggunakan tanda kutip ganda, tanda centang kembali. Dalam kasus terakhir tidak ada yang "membobol", jadi Anda cukup menulis 1 union select password from users-- atau payload sql apa pun yang diinginkan penyerang.

Kondisi selanjutnya di mana fungsi escape ini akan gagal adalah jika sub-string diambil setelah string di-escape (dan ya Saya telah menemukan kerentanan seperti ini di alam liar):

string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";

Dalam hal ini nama pengguna abcdefgji' akan diubah menjadi abcdefgji'' oleh fungsi escape dan kemudian diubah kembali menjadi abcdefgji' dengan mengambil sub-string. Ini dapat dimanfaatkan dengan menyetel nilai sandi ke pernyataan sql apa pun, dalam hal ini or 1=1-- akan ditafsirkan sebagai sql dan nama pengguna akan ditafsirkan sebagai abcdefgji'' and password= . Query yang dihasilkan adalah sebagai berikut:

select * from users where name='abcdefgji'' and password=' or 1=1-- 

T-SQL dan teknik injeksi sql canggih lainnya yang telah disebutkan. Injeksi SQL Tingkat Lanjut Dalam Aplikasi SQL Server adalah makalah yang bagus dan Anda harus membacanya jika Anda belum melakukannya.

Masalah terakhir adalah serangan unicode. Kelas kerentanan ini muncul karena fungsi escape tidak mengetahui pengkodean multi-byte, dan ini dapat digunakan oleh penyerang untuk "mengkonsumsi" karakter escape. Menambahkan "N" ke string tidak akan membantu, karena ini tidak memengaruhi nilai karakter multi-byte nanti di string. Namun, jenis serangan ini sangat jarang terjadi karena database harus dikonfigurasi untuk menerima string unicode GBK (dan saya tidak yakin MS-SQL dapat melakukannya).

Injeksi kode orde kedua masih dimungkinkan, pola serangan ini dibuat dengan memercayai sumber data yang dikendalikan penyerang. Escape digunakan untuk merepresentasikan karakter kontrol sebagai karakter literalnya. Jika pengembang lupa untuk menghindari nilai yang diperoleh dari select dan kemudian menggunakan nilai ini dalam kueri lain lalu bam penyerang akan memiliki satu kutipan literal karakter yang mereka miliki.

Uji semuanya, jangan percaya apa pun.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tentukan ukuran baris untuk tabel

  2. Bagaimana cara membersihkan (mencegah injeksi SQL) SQL dinamis di SQL Server?

  3. Menghitung nilai menggunakan nilai baris sebelumnya di T-SQL

  4. Cara Mengembalikan Daftar Acara Pemicu di SQL Server

  5. Melewati Daftar<> ke SQL Stored Procedure