【ctf】sql注入——基于时间的盲注

基于时间的盲注

原理:利用sleep()或benchmark()等函数让mysql执行时间变长,并结合判断条件if(expr1,expr2,expr3),然后通过页面的响应时间长短来判断语句返回的值是TRUE还是False,从而猜解一些未知的字段。

函数sleep(duration):
睡眠(暂停)时间为duration参数给定的秒数,然后返回0。若sleep()被中断,它会返回1。

select * from table where id=1 and sleep(3);
select * from table where id=1 or  sleep(3);

这里我们进行测试:可以看到我们的表中一共有三列三条数据
在这里插入图片描述
这里我们查询id=1的数据

select * from user where id=1;

在这里插入图片描述
可以看到该语句是马上执行的,但我们在语句后加入sleep()函数时:
在这里插入图片描述
发现语句延迟了三秒才执行。

select * from user where id=1 or sleep(3);

在这里插入图片描述
而当我们使用or逻辑时发现延迟到了六秒
原因在于当我们使用and逻辑时,必须前后都成立才能返回正确;
而当我们使用or逻辑时,前半段正确则不执行后半段语句;
在这里,我们的表中一共有id=1,2,3的数据,当语句遇到id=1时,返回正确,不执行sleep(3),
而当语句遇到id=2,3时,前半段不正确,则执行sleep(3),一共执行两次,延迟六秒。

这里,我们可以猜想,如果使用and逻辑检测字段是否存在,通过返回的时间来判断是否存在该字符。
在这里插入图片描述
这里看到该表中id=1,2,3,那么我们可以使用sleep()来进行检测
在这里插入图片描述在这里插入图片描述
当猜想正确与错误时会返回两种结果,这样就可以进行接下来的操作了

这里我们了解一个函数if(x,y,z);

if(条件1,条件2,条件3);
当条件1符合时,返回条件2;
否则返回条件3

进行测试:
在这里插入图片描述
然后我们将条件更改一下再进行尝试:在这里插入图片描述

这里再介绍几个函数:
substri(x,y,z);
x:需要查询的字符或字符串;
y:查询的位置;
z:查询的长度;
在这里插入图片描述

substring(x,y);
返回字符串x在y位置后的所有:
在这里插入图片描述

substring(x from y);
返回字符串x在y位置后的所有:
在这里插入图片描述

substring(x from y for z);
返回字符串x在y位置后z个字符:
在这里插入图片描述

substring_index(x,y,z);
返回字符串x中第z次出现的y字符的前面所有:
注:z可以是负数,如果z为负数则从后往前计算,返回也是返回后半段。
在这里插入图片描述
在这里插入图片描述

还有正则表达式法等
在这里插入图片描述
在这里插入图片描述

接下来我们看另一个函数:select case when条件触发
select case when x then y else z end from user;
当x事件发生时,输出y,否则输出z;
在这里插入图片描述
这里我们可以发现y或z处可以插入语句,例如sleep(),这样我们就可以利用此处来进行注入;
在这里插入图片描述
使用语句:

select * from user where id =1 and (if(substr(database(),1,1)='w',sleep(3),null));

若‘’被过滤,可以采用ascii码的方式:

select * from user where id =1 and (if(ascii(substr(database(),1,1))=119,sleep(3),null));

在这里插入图片描述

还有许多函数,例如:
函数benchmark(x,y):
y函数执行x次,通过计算次数来代替延时;

select benchmark(1000000,sha(1));
select * from user where id = 1 and benchmark(1000000,sha(1));

在这里插入图片描述

select count(*) from information_schema.columns A,information_schema.columns B,information_schema.tables C;

利用笛卡尔积的方式,表A表B表C;(可能延时会过高)
在这里插入图片描述

在这里插入图片描述

函数GET_LOCK(x,y);
设法使用给字符串x给定的名字得到一个锁,超时为y秒;
注:需要重新打开端口或另一个会话;

select GET_LOCK('a',5);

在这里插入图片描述

函数RLIKE
通过rpad或repeat构造长字符串,加以计算量大的patten,通过repeat的参数可以控制延时长短。
select concat(rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),
rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,
999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,99999
9,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’),rpad(1,999999,‘a’)) RLIKE
‘(a.)+(a.)+(a.)+(a.)+(a.)+(a.)+(a.*)+b’;
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值