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.