基本利用-sleep

基础利用

用法:sleep(延时的秒数)

一般情况下,使用ifcase构造条件表达式进行延时:

if((condition), sleep(5), 0);
CASE WHEN (condition) THEN sleep(5) ELSE 0 END;

无if和case的解决办法

假设ifcase被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#'

作者 admin

百度广告效果展示