前言

在sql注入的延时注入中,常见的函数有sleep()直接延时、BENCHMARK()通过让数据库进行大量的计算而达到延时的效果、笛卡尔积、正则匹配等,但还有一个常常被忽略的函数,也就是Mysql中的锁机制。虽然早些年就已经出现过相关的技术文章,但是他的应用却几乎见不到,也没有看到有文章对他的机制和运用进行深入讲解,而且该函数也常常被waf忽略导致延时。

Mysql锁机制介绍

函数介绍

GET_LOCK() 是 MySQL 提供的一个用户级锁函数,用于在应用层实现跨会话的锁机制。以下是该函数的解析:

GET_LOCK(str lock_name, int timeout)

参数:

lock_name(字符串):锁名称(最大64字符,区分大小写)

timeout(整数):等待超时时间(秒),0表示立即返回,负数表示无限等待(MySQL 5.7.5+)

返回值:

1:成功获取锁

0:获取锁超时(其他会话持有锁且未在指定时间内释放)

NULL:发生错误(如参数无效、内存不足等)

RELEASE_LOCK(str)

用于解开锁,str表示要解开的锁名

返回值:

1:成功释放,当前会话持有锁并成功释放

0:释放失败,当前会话不持有该锁

NULL:错误或锁不存在, 锁名称从未被获取

示例:

通过返回值1判断成功获取名为1的锁

通过返回值1判断成功释放名为1的锁

再次释放时,则为Null(锁不存在)

核心特性

命名锁机制:

基于字符串名称的锁,不同锁名互不影响,例如:

GET_LOCK('test1', 10)

GET_LOCK('test2', 10)

他们直接由于锁名不同,所以互不影响

会话级作用域:

当一个会话成功获取了某个命名锁后,其他会话在尝试获取相同名称的锁时将会被阻塞,直到锁被释放或超时。

而在同一个会话内部,即使多次请求相同的锁,也不会造成阻塞,会直接返回成功,因为该会话已经持有该锁。

示例:

会话1先通过GET_LOCK()函数获取了名为1的锁,返回结果为1表示获取成功

会话2再次通过GET_LOCK()函数获取名为1的锁,但是名为1的锁以及被会话1占有,所以会话2直到超时5秒,结果为0表示获取失败

锁释放规则:

显式释放:RELEASE_LOCK('lock_name')

隐式释放:会话终止(连接关闭)

时效释放:受wait_timeout 参数控制

不会随事务结束自动释放(与InnoDB行锁不同)

SHOW VARIABLES LIKE 'wait_timeout';

可以查看会话超时时间(秒),这里是2分钟

SET SESSION wait_timeout = 600;

可以通过该函数来设置wait_timeout参数

通过网上搜索发现wait_timeout参数的默认值是8小时,但是我的数据库默认就是2分钟,也没有看到官方的具体说明,可能是受到Mysql版本的影响。

Web各类布局中的利用

利用条件

刚刚讲完了Mysql锁的机制,那么要使用GET_LOCK()函数成功让目标数据库发现延迟,就需要具备以下两个条件:

  1. 需要不同会话(只有不同会话的锁竞争才会导致延时)
  2. 获取锁的会话具备长时效应(既会话或锁不被马上释放)

短会话模式

模式简介:

每个HTTP请求都新建数据库连接,请求完成后立即关闭连接。无连接复用。

使用规模:

极少,主要存在于遗留系统或极低流量场景

利用可行性:

这种情况下,大概率是无法造成锁等待,虽然每次用户的请求满足条件1:需要不同会话。但是无法满足条件2:获取锁的会话具备长时效应。也就是说当A会话获取完锁a,B会话还没来得及等待锁a,A会话就已经结束了,就自动释放锁,就无法达到锁等待的效果。

举一个最简单的例子,phpstudy中搭建的靶场sqli-labs就是如此(短会话模式)

这里拦截后大量发包,在一次性并发。

通过数据库监听工具可以看到,当数据库还没来得及因为其他会话的锁造成等待,其他会话的锁就已经结束并关闭连接,自动释放锁了。所以不满足条件2:获取锁的会话具备长时效应。

长会话模式

模式简介:

整个Web应用使用单个持久数据库连接,所有用户请求共享此连接。

使用规模:

较少,特定场景:金融交易系统、小型嵌入式应用,一些较老的cms也存在此情况

利用可行性:

所有用户操作在同一个会话中,但条件1需要不同会话才会产生锁等待,所以不会发生锁等待,也就不能造成延时的效果

这里以MRCMS-3.1.2版本为例,他就是长会话模式

通过数据库监听工具可以看到,无论进行多少次数据库操作他的thread_id一直都为994,尽管切换登录,替换用户凭证,ip等都还是thread_id为994且没有断开连接,那么就不满足条件1:需要不同会话(只有不同会话的锁竞争才会导致延时),也就不会导致锁等待,就不会造成延时的效果。

连接池模式

模式简介:

预先创建连接池(如20个连接)

每个HTTP请求从池中借用连接,用完归还

物理连接复用,逻辑会话隔离,既每个会话重复的从连接池中使用连接

使用规模:

主流,现代Web应用常出现,Spring Boot(HikariCP), Django, Laravel等默认使用

利用可行性:

锁绑定物理连接,不自动释放

用户A获取锁 → 未释放 → 连接1归还但不自动释放 → 用户B使用连接2 → 锁冲突

利用方法:

那么只要我们通过大量的请求,就一定会从Pool中请求到两个不同的物理连接,这样利用GET_LOCK函数就能达到延时的效果

用户级长连接(绑定会话)

模式简介:

每个用户分配专属数据库连接,在整个会话期间保持打开(既长连接)。

使用规模:

较少,实时系统:在线协作工具、交易平台

利用可行性:

用户A在会话1持有锁

用户B在会话2请求同名锁 → 满足条件1(不同会话)+条件2(锁未释放)

利用方法:

只要不同用户的凭证去请求同一个锁,比如GET_LOCK(1,5)那么就会发生锁等待,造成延时效果

IP/客户端级连接

模式简介:

与上一个用户级长连接极其相似,只不过按客户端IP分配固定连接,同IP的多个用户共享连接。

使用规模:

极少,特殊场景:游戏服务器、定制网关

利用可行性:

IP组内:同会话无冲突(如IP1用户A和用户B无锁等待)

IP组间:不同会话有冲突(如IP1用户 vs IP2用户)

利用方法:

和用户级长连接(绑定会话)类似,只是需要ip不同

Web共用数据库

模式简介:

现在常见的web部署方式为站库分离,且多站共用一个库,多个独立应用(如微服务)共享同一数据库,各自使用连接池。

使用规模:

常见,微服务架构,现代云原生应用常见模式

利用可行性:

多web共享同一连接池:那么原理与连接池模式相同

多web使用独立连接池:不同连接池=不同会话,原理与连接池模式相同

多web不使用连接池+全是短会话:无法产生,与短连接原理相同

多web不使用连接池+全是长会话:无法产生,与长连接原理相同

多web不使用连接池+长会话+短会话:不同web的连接也就会产生不同的会话,满足条件1:需要不同会话;长会话满足条件2:获取锁的会话具备长时效应。

利用方法:

多web不使用连接池+长会话+短会话:先对长会话的web进行注入来获取锁,再通过短会话web注入来达到锁等待,造成延时效果。

雷池waf延时实战

雷池waf配置

这里均采用默认配置

常规延时手段

Sleep延时被拦截

BENCHMARK函数被拦截

可以看到常规的延时手法都直接拦截了,那么接下来使用我们刚刚讲解的锁机制来延时

锁函数造成延时

这里采用两个web共用一个数据库的形式,一个是phpstudy中搭建的靶场sqli-labs短会话模式,另一个是MRCMS-3.1.2长会话模式,那么两者构成的就是多Web共用数据库模式。

多web不使用连接池+长会话+短会话:

先对长会话的web进行注入来获取锁,再通过短会话web注入来达到锁等待,造成延时效果。

先使用MRCMS-3.1.2的漏洞接口注入来获取锁:

然后在sqli-labs中直接注入

?id=1%27||%20GET_LOCK(1,5)%20||%27

成功造成延时效果,且不触发雷池waf拦截

接着嵌套if语句,依旧成功造成延时,且不触发雷池waf拦截

?id=1%27||%20if(1,GET_LOCK(1,5),1)%20||%27

通过数据库监听工具看到时间部分确实造成了延时,以及长会话和短会话共用数据库连接导致的不同会话造成了锁等待,最终产生延时效果

到雷池waf后台可以看到锁函数实际上是检测到了,但在默认配置下不拦截,只拦截了底部的两条比较常见的延时函数。

总结

利用锁机制的优势就是不易被waf检测(在写文章的时候似乎写入其他延时payload会导致出错无法预览,而锁机制的延时payload则可以正常预览,这也算是不易被检测的一种),既然大名鼎鼎的雷池waf都能成功延时,那么市面上大多数的waf应该也一样。

那么接下来的注入方法就由各位师父大显神通了,这里就不再做太多的赘述。 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博途多重背景、参数实例

1:我们在博途中先新建一个工程,并且建立一个FB块名字为motor_fb,同样建立一个FC块名字为MOTOR_FC,里面写上我们电机程序里常用的逻辑控制。二者程序内容相同。下面是motor_fb块的程序截图: 2:我们再新建一个FB块,名字为…

运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,目前中南大学MBA在读,也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。🐳 &…

大模型在重症哮喘手术全流程风险预测与治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目标与方法 1.3 研究创新点 二、重症哮喘概述 2.1 定义与发病机制 2.2 分类与临床表现 2.3 诊断标准与方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例分析 3.3 适用于重症哮喘预测的…

Webpack的插件机制Tapable

Tapable 是一个轻量级的库,用于创建和管理插件钩子(hooks),它在 Webpack 中广泛应用,用于实现插件系统。Tapable 提供了一种机制,允许插件在特定的生命周期阶段插入自定义逻辑,从而扩展应用程序…

FRONT归因-两阶段训练流程

FRONT, Fine-Grained Grounded Citations归因 FRONT归因,首先从检索到的源文档中选择支持性引用,然后基于这些引用指导生成过程,确保生成回答有据可依,引用准确无误。 FRONT的特色在于两阶段归因训练,要点如下: 阶…

单端转差分放大器AD8138

根据 AD8138 的数据手册特性及参数,可以实现单端 5Vpp(偏置 0V)正弦波转差分 5Vpp(共模 2.5V)的功能,但需注意以下细节: 1. 信号幅度匹配性 输入信号:单端 5Vpp(峰峰值…

用R包mice进行多重插补

利用R包mice实现的链式方程多重插补方法来插补缺失的数据。 所有多重插补方法都遵循三个步骤 插补——与单次插补类似,对缺失值进行插补。但是,插补值会从分布中提取m次,而不是仅提取一次。此步骤结束时,应该有m 个完整的数据集…

【专题】网络攻防技术期末复习资料

网络攻防技术期末复习资料 链接:https://blog.csdn.net/Pqf18064375973/article/details/148996272?sharetypeblogdetail&sharerId148996272&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 网络安全威胁的成因。 分类&#xff1a…

地震灾害的模拟

为确保地震灾害模拟的准确性和高效性,涉及的系统需要处理复杂的物理模型、数据输入和多层次的模拟过程。在技术设计方案中,我们将涵盖以下几个方面: 背景:描述该模拟系统的目的与应用场景。需求:列出系统的功能需求&a…

9.9 《1/10成本实现GPT-3.5级表现!ChatGLM3-6B QLoRA微调实战:4bit量化+低秩适配全解析》

1/10成本实现GPT-3.5级表现!ChatGLM3-6B QLoRA微调实战:4bit量化+低秩适配全解析 ChatGLM3-6B 微调入门实战:QLoRA 量化低秩适配技术 ▲ ChatGLM3-6B采用GLM架构改进版,支持32K上下文长度和代码生成能力 一、QLoRA 技术原理精要 QLoRA(Quantized Low-Rank Adaptation)…

【Python基础】11 Python深度学习生态系统全景解析:从基础框架到专业应用的技术深度剖析(超长版,附多个代码及结果)

引言:Python在深度学习领域的统治地位 在人工智能浪潮席卷全球的今天,Python已经成为深度学习领域当之无愧的王者语言。这不仅仅是因为Python语法简洁易学,更重要的是围绕Python构建的深度学习生态系统的完整性和强大性。从Google的TensorFlow到Facebook的PyTorch,从科学计…

RESTful API 设计原则深度解析

在 Web 服务架构中,RESTful API作为一种轻量级、可扩展的接口设计风格,通过 HTTP 协议实现资源的标准化访问。本文从核心原则、URL 设计、HTTP 方法应用、状态管理及面试高频问题五个维度,结合工程实践与反例分析,系统解析 RESTfu…

java web2(黑马)

数据库设计 简介 1.软件的研发步骤 2.数据库设计概念 > 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优 的数据存储模型 > 建立数据库中的表结构以及表与表之间的关联关系的过程, > …

Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持

近日 Meta 正式宣发加入了 Kotlin 基金会,如果你对 Meta 不熟悉,那么对于开源了 React Native 的 Facebook 应该不陌生了吧?现在它也正式加入了 Kotlin 领导者的阵营: Kotlin 基金会 是由 Jetbrains 和 Google 共同成立的基金会&a…

缓存系统-淘汰策略

目录 一、LRU(最近最少使用) 工作原理 操作流程 基本特征 二、LFU(最不常使用) 工作原理 操作流程 基本特征 三、ARC 自适应 工作原理 操作流程 基本特征 四、TTL(生存时间) 工作原理 操作流…

TypeScript 安装使用教程

一、TypeScript 简介 TypeScript 是由微软开发的开源编程语言,是 JavaScript 的超集,添加了静态类型、接口、枚举、类等特性,使开发大型应用更安全、可维护、可扩展。最终会被编译为标准的 JavaScript 代码在浏览器或 Node.js 中运行。 二、…

强化学习系列--dpo损失函数

DPO 概要 DPO(Direct Preference Optimization,直接偏好优化)是由斯坦福大学等研究团队于2023年提出的一种偏好优化算法,可用于LLM、VLM与MLLM的对齐训练。 算法基于PPO的RLHF基础上进行了大幅简化。DPO算法跳过了训练奖励模型这…

UniApp完全支持快应用QUICKAPP-以及如何采用 Uni 模式开发发行快应用优雅草卓伊凡

UniApp完全支持快应用QUICKAPP-以及如何采用 Uni 模式开发发行快应用优雅草卓伊凡 一、UniApp 对快应用的支持深度 UniApp 已完全支持快应用的开发和发布,具体包括: 两种渲染模式: Webview 渲染(快应用 Light 版)&a…

js 允许生成特殊的变量名 基于字符集编码混淆的 XSS 绕过漏洞 -- Google 2025 Lost In Transliteration

题目实现了一个字符转换工具 在/file路由用户可以通过 ct 参数自定义 Content-Type // 文件路由 - 提供静态文件服务(JS和CSS),支持内容类型验证 app.MapGet("/file", (string filename "", string? ct null, string?…

【仿muduo库实现并发服务器】LoopThreadPool模块

仿muduo库实现并发服务器 1.LoopThread模块1.1成员变量1.2构造函数13线程入口函数1.4获取eventloop对象GetLoop() 2.LoopThreadPool模块2.1成员变量2.2构造函数2.3配置线程数量2.4按照配置数量创建线程2.5依次分配Eventloop对象 1.LoopThread模块 这个模块是为了将EventLoop与…