目录
基于时间的SQL盲注 - 延时注入
案列演示
基于时间的SQL盲注 - 延时注入
关于延时注入的使用场景一般在我们测试的注入点没有报错信息又没有回显点的情况下进行的。通过对于时间的延时判断来猜解数据。在实战过程中并不推荐大家通过延时注入去判断数据库,因为实在是太麻烦了。
知识储备:
sleep(): Sleep 函数可以使计算机程序(进程,任务或线程)进入休眠
if(): i f 是 计算机编程语言一个关键字,分支结构的一种
mid(a,b,c): 从b开始,截取a字符串的c位
substr(a,b,c): 从b开始,截取字符串a的c长度
left(database(),1),database() : left(a,b)从左侧截取a的前b位
length(database())=8 : 判断长度
ord=ascii ascii(x)=100: 判断x的ascii值是否为100
在不使用sleep下查询数据所需要的时间:0.03秒
使用sleep可以使查询数据休眠指定时间 ,我们这里指定休眠3秒。
if(a,b,c):可以理解在java程序中的三目运算符,a条件成立 执行b, 条件不成立,执行c :
使用if与sleep结合使用:
达到延时数据显示,从而通过数据显示的时间判断数据对错!
案列演示
使用靶场less-2来实现延时注入:
我们构造如下语句:
id=1%20and%20sleep(if(database()=%27security%27,5,0)) --+
然后我们看到这条语句在执行的时候:
时间延迟显示了5秒,说明了数据库的名称是对的,所以if语句执行了延时5秒。
我们可以通过length()来判断数据库的长度 ,假如我们这里的数据库的名称长度为8,我们构造如下语句:
id=1%20and%20sleep(if(length(database())=8,8,0))
最终页面加载了八秒才有回显,说明数据库字符长度为8,在实际中,我们可以通过这样的办法一个一个去猜解数据库库名的长度。
接下来我们讲解延时注入里常用到的函数
mid这个函数有三个参数:
mid()使用:
我们这里数据库的名称是test,mid这个函数从当前的数据库的名称中第一位开始,截取一位长度的字符串,所以返回了t,如果我们这里是select mid(database(),1,2)l;的话,那么就会返回te两个字符了。
substr()函数 :
Substr()和substring()函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length) string substr(string, start, length)
参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。
substr()函数使用:
Left()函数 :
Left()得到字符串左部指定个数的字符
Left ( string, n ) string为要截取的字符串,n为长度。
ASCII码
使用ascii函数() :
这里的意思就是x这个字符的ascii码字符十进制是否为120,是则回显123,否则回显234.这里回显了123,说明x这个字符十进制为120。
id=1 and if(ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=120,sleep(3),0)
我们这里构造如上的语句就是判断当前的数据库的第一个表的表名第一位是否为‘x’,是则休眠3秒,否则不休眠。在实际操作中,我们可以一个一个修改位于120这个位置上的数字去猜解当前的表名,是不是看起来太麻烦了?所以实战中我并不推荐这种方法去爆破数据库。