1. Potong kandungan pertanyaan
Sekiranya anda ingin mengabaikan skrip dalam pertanyaan. Sebagai contoh, untuk pemprosesan di bawah, pertanyaan memerlukan keadaan active=1 tetapi kita boleh mengulas (--, -- -, -+, #, /*, /**/, // , ;%00…) dan abaikan. Apabila melombong, kita sering tidak tahu apa yang dilakukan oleh baki kandungan pertanyaan, jadi menggunakan ulasan dalam kes ini adalah sangat berkesan.

Selepas mengulas, pertanyaan kami menjadi:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
2. Pintasan penapisan kata kunci
a. Komen Sebaris
Komen sebaris digunakan dengan sangat berkesan untuk memintas penapisan ruang putih. Anda boleh menggunakan aksara berikut untuk memintas penapisan ruang putih: /**/, %20, %09, %0a, %0b, %0c, %0d, %a0). Sebagai contoh:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Atau memintas penapisan kata kunci (tersedia dengan MySql). Dalam contoh di bawah, kata kunci kesatuan dan kata laluan berada dalam senarai hitam supaya kata kunci tersebut telah disekat. Kami boleh memintasnya dengan:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
b. Gantikan kata kunci
Apabila mengeksploitasi suntikan SQL, kami sering menggunakan kata kunci seperti: union, select, information_schema... Dalam banyak kes, pengaturcara hanya menggantikan kata kunci tersebut:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Kita boleh melihat dengan mudah bahawa kod pemprosesan di atas adalah kurang. Jika ia hanya padanan corak, pintasan adalah sangat mudah. Mari kita gunakan sensitif huruf besar, di mana huruf besar dan huruf kecil ditafsirkan secara berbeza.
Sekarang daripada menggunakan kata kunci:
select, union…
Kami akan menggunakan:
SeLEcT, UniOn…
Asas pintasan ini ialah sistem pengurusan pangkalan data tidak membezakan antara kata kunci kes dan kes.
Dalam sesetengah kes, aplikasi web akan menapis semua atau sebahagian daripada kata kunci tertentu (kesatuan, pilih...). Kami akan memintas seperti berikut:
id=1+uniunionon+SeLselectecT+1,2,3-- -
Selepas kesatuan dan pilihan ditapis oleh aplikasi web, kami akan ditinggalkan dengan pertanyaan yang betul seperti berikut:
id=1+union+SeLecT+1,2,3-- -
c. Pengekodan aksara
Kami boleh memintas apabila WAF (Web Application Firewall) menyekat kata kunci dengan mengekodnya. Banyak aplikasi WAF hanya akan menyahkod pertanyaan sekali dan menapis kata kunci dalam senarai hitam, kemudian mari kita mengekod permintaan dua kali supaya ia boleh dipintas dalam kes ini.
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
3. Pintasan menyekat petikan tunggal dan berganda
- Mari lihat contoh sebelum mempelajari secara khusus tentang pintasan ini.
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Dalam senario ini, kami mempunyai jadual dalam pangkalan data bernama pengguna. Tugas seterusnya ialah mengetahui nama lajur dalam jadual untuk mendapatkan maklumatnya. Seperti dalam pertanyaan di atas, kami menggunakan syarat: table_name='users'. Tetapi jika kedua-dua petikan tunggal (') dan petikan berganda (") disekat oleh WAF, kita tidak boleh lagi menggunakan 'pengguna' atau "pengguna". Jadi bagaimana untuk menyelesaikan masalah ini? Sistem pangkalan data terbina dalam memberikan kita fungsi yang menyelesaikan masalah ini dengan baik, iaitu fungsi CHAR( ) (untuk Oracle ialah CHR()). Contohnya, dalam pertanyaan di atas kita akan memintasnya dengan:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Pengaturcara PHP sangat biasa dengan fungsi addslashes(). Fungsi addslashes() mempunyai kesan menambah sebelum aksara khas seperti petikan tunggal ('), petikan berganda ("), garis miring ke belakang (\), NUL (bait nol) aksara "\" untuk membantu sistem pengurusan pangkalan data. Adakah terdapat tiada kesukaran dan kekeliruan semasa mengendalikan rentetan yang mengandungi aksara tersebut? Oleh itu, apabila kita ingin menyuntik ke dalam pertanyaan mengikut skrip: name='someName' atau '1'='1'-- Hasilnya tidak lagi seperti yang kita jangkakan.
Walau bagaimanapun, terdapat teknik untuk memintas fungsi addslashes() untuk menyuntik aksara petikan tunggal ('). Teknik ini telah lama diketahui umum, dan melaksanakan teknik ini agak sukar kerana ia terikat dengan gaya pengekodan yang digunakan pada laman web.
4. Pintas ralat "campuran haram pengumpulan untuk operasi UNION"
Dalam sesetengah sistem pengurusan (biasanya ditemui dalam MySql), apabila pangkalan data dan jadual telah ditetapkan kepada penyusunan, apabila menggunakan kata kunci UNION, ralat "campuran tidak sah pengumpulan untuk operasi UNION" akan dilaporkan. Menetapkan pengumpulan boleh disebabkan oleh niat pereka pangkalan data atau disebabkan oleh tetapan lalai MySql. Dalam kes menggunakan kesatuan, kami mesti memastikan bahawa syarat nilai pilih dalam setiap medan mesti mempunyai jenis kod yang sepadan ditakrifkan. Pada pendapat saya, ralat ini agak biasa, terutamanya untuk CMS yang menjalankan Apache MySql. Orang ramai boleh mengetahui lebih lanjut di: http://bugs.mysql.com/bug.php?id=57926.
Dalam kes ini, kita boleh menggunakan cara untuk menukar kepada jenis pengekodan yang sesuai.
Contohnya dalam kes berikut:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Dalam pertanyaan di atas, jika lajur1 mempunyai susunan yang ditetapkan kepada Unicode-UTF8 atau _latin1, sebagai contoh, maka perkara yang dipilih daripada lajur2 perlu ditukar kepada kod yang sepadan. Kita boleh memaksa gaya seperti berikut:
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Kami melihat kelemahan dalam kaedah pintasan ini: kita perlu tahu bahawa kod yang disusun ialah _latin1. Cara yang lebih baik untuk memintasnya, pada pendapat saya, adalah menggunakan fungsi pengekodan dan penyahkodan hex dan unhex.
![Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan Web5: Suntikan SQL - Beberapa teknik untuk memintas mekanisme penapisan]()
Terdapat banyak fungsi lain yang boleh digunakan sebagai ganti hex dan unhex.