1. MySQL中的sleep函数
在MySQL中执行select sleep(N)可以让此语句运行N秒钟,例如下图所示:
Sleep函数的主要用途在于确定MySQL语句是否真正被执行了。比如下面语句执行时间为0.00秒,线程信息一闪而过,根本无从察觉。
这种情况下,我们通过在语句中添加一个sleep(N)函数,强制让语句停留1秒钟,来查看后台线程,例如下图所示:
但是你使用这个办法,是有前提的,它只能指定条件的记录存在时机会停止指定的秒数,比如咱们的库里并没有pig,查询条件设置为name= 'pig’,结果会表名记录不存在,执行时间为0。
我们在数据库不存在这个数据时,即使你添加了sleep(N)这个函数,语句的执行还是会一闪而过。例如下图︰
另外需要注意的是,添加sleep(N)这个函数后,语句的执行具体会停留多长时间取决于满足条件的记录数,MySQL会对每条满足条件的记录停留N秒钟,比如︰
针对该语句添加了sleep(1)这个函数后语句总的执行时间为3.01秒,可得出,MySQL对每条满足条件的记录停留了一秒钟。
2. Sleep注入时所用函数
2.1 什么是ASCII码
2.1.1 ASCII码介绍
ASCII是基于拉丁字母的—套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC646。
2.1.2 ASCII码表述方式
ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。
2.1.3 为何会有ASCII码表
我们的计算机,只能存储二进制数据,本身没办法存放这些字符的,但是,我们的语言都需要这些字符,那么我们的程序是怎么处理字符的﹖这里就要有一个规定,使用[0,127]的一个数值来表示一个字符(英文字母,符号等)这样机会有一个——对应的关系,那么这个就是我们的ASCII码表。
2.1.4 ASCII码表应用
比如我们的ASCII码A对应的是数值是65,那么在内存里面,‘A’和65到底有没有区别呢﹖答案是完全没有区别的,就是存放的是65的二进制。当你把65当作数据时,那么它就是65;如果你把它当作字符那么我们的计算机就会调用计算机图形学的编程,将我们的A的图形绘制到屏幕上。
ASCII码对照表如下:
2.2 Substr()函数
Substr()函数是用来截取数据库中的某一列字段中的一部分。
substr(string string,num start,numlength);
- string为字符串;
- start为起始位置,最小为1;
- length为长度。
2.3 Count()函数
- count(*)
包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录。 - Count(1)
忽略所有列,1表示一个固定值,也可以用count(2)、count(3)代替,在统计结果的时候,不会忽略列值为NULL的记录。 - count(列名)
只包括列名指定列,返回指定列的记录数,在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内。 - count(distinct列名)
只包括列名指定列,返回指定列的不同值的记录数,也就是说同样的数据只会输出一次,在统计结果的时候,在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和o ),即列值为NULL的记录不统计在内。
2.4 length()函数
LENGTH(str)
- 一个多字节字符算作多字节
- 对于包含五个两字节字符的字符串,length()返回10
- 一个汉字是算三个字符,一个数字或字母算一个字符
3. MySQL盲注(基于时间)
- if(payload,sleep(3),1)
即payload正确时,程序暂停3秒。否则立刻执行。 - if(payload,1,sleep(3))
即payload正确时,程序立刻执行,否则暂停3秒。
3.1 盲注的一般步骤
文章参考哔哩哔哩奇安信网络安全培训视频