Mysql注入中锁机制的应用
字数 2339 2025-09-01 11:26:17
MySQL注入中锁机制的应用详解
一、前言
在SQL注入的延时注入技术中,常见的延时函数包括sleep()、BENCHMARK()、笛卡尔积和正则匹配等。然而,MySQL中的锁机制函数GET_LOCK()和RELEASE_LOCK()常被忽视,却是一种有效的延时注入手段。这种技术不仅能够绕过许多WAF的检测,而且在特定场景下非常有效。
二、MySQL锁机制介绍
1. 核心函数
GET_LOCK(str lock_name, int timeout)
- 功能:获取一个用户级命名锁
- 参数:
lock_name:锁名称(最大64字符,区分大小写)timeout:等待超时时间(秒)- 0:立即返回
- 负数:无限等待(MySQL 5.7.5+)
- 返回值:
- 1:成功获取锁
- 0:获取锁超时(其他会话持有锁且未在指定时间内释放)
- NULL:发生错误(如参数无效、内存不足等)
RELEASE_LOCK(str lock_name)
- 功能:释放一个用户级命名锁
- 参数:
lock_name:要释放的锁名
- 返回值:
- 1:成功释放(当前会话持有锁并成功释放)
- 0:释放失败(当前会话不持有该锁)
- NULL:错误或锁不存在
2. 核心特性
-
命名锁机制:
- 基于字符串名称的锁,不同锁名互不影响
- 例如:
GET_LOCK('test1', 10)和GET_LOCK('test2', 10)互不干扰
-
会话级作用域:
- 一个会话获取锁后,其他会话尝试获取同名锁会被阻塞
- 同一会话内多次请求相同锁不会阻塞,直接返回成功
-
锁释放规则:
- 显式释放:
RELEASE_LOCK('lock_name') - 隐式释放:
- 会话终止(连接关闭)
- 受
wait_timeout参数控制(默认值因版本而异,可能是8小时或2分钟)
- 不会随事务结束自动释放(与InnoDB行锁不同)
- 显式释放:
三、Web应用中的数据库连接模式与利用条件
1. 利用条件
要成功利用锁机制进行延时注入,必须满足两个条件:
- 需要不同会话(只有不同会话的锁竞争才会导致延时)
- 获取锁的会话具备长时效应(会话或锁不被马上释放)
2. Web应用数据库连接模式分析
(1) 短会话模式
- 特点:每个HTTP请求新建数据库连接,请求完成后立即关闭
- 使用场景:遗留系统或极低流量场景
- 利用可行性:低
- 满足条件1(不同会话)
- 不满足条件2(锁被快速释放)
- 示例:sqli-labs靶场
(2) 长会话模式
- 特点:整个Web应用使用单个持久数据库连接
- 使用场景:金融交易系统、小型嵌入式应用、部分老旧CMS
- 利用可行性:低
- 不满足条件1(所有操作在同一会话中)
- 示例:MRCMS-3.1.2
(3) 连接池模式
- 特点:
- 预先创建连接池(如20个连接)
- 每个HTTP请求从池中借用连接,用完归还
- 物理连接复用,逻辑会话隔离
- 使用场景:主流现代Web应用(Spring Boot、Django、Laravel等)
- 利用可行性:高
- 锁绑定物理连接,不自动释放
- 用户A获取锁→未释放→连接1归还但不自动释放→用户B使用连接2→锁冲突
- 利用方法:大量请求确保获取不同物理连接
(4) 用户级长连接(绑定会话)
- 特点:每个用户分配专属数据库连接,在整个会话期间保持打开
- 使用场景:在线协作工具、交易平台
- 利用可行性:高
- 用户A在会话1持有锁
- 用户B在会话2请求同名锁
- 满足条件1(不同会话)+条件2(锁未释放)
(5) IP/客户端级连接
- 特点:按客户端IP分配固定连接,同IP的多个用户共享连接
- 使用场景:游戏服务器、定制网关
- 利用可行性:
- IP组内:同会话无冲突
- IP组间:不同会话有冲突
- 利用方法:需要不同IP的用户
(6) 多Web共用数据库
- 特点:多个独立应用(如微服务)共享同一数据库
- 使用场景:现代云原生应用、微服务架构
- 利用可行性:
- 多web共享同一连接池:同连接池模式
- 多web使用独立连接池:不同连接池=不同会话
- 多web不使用连接池+长会话+短会话:不同web的连接产生不同会话
- 长会话满足条件2
- 短会话满足条件1
- 利用方法:先对长会话web注入获取锁,再通过短会话web注入造成锁等待
四、实战案例:绕过雷池WAF
1. 测试环境
- 雷池WAF默认配置
- 两个Web应用共用数据库:
- sqli-labs(短会话模式)
- MRCMS-3.1.2(长会话模式)
2. 常规延时手段测试
sleep():被拦截BENCHMARK():被拦截
3. 锁机制延时注入步骤
-
通过MRCMS-3.1.2获取锁:
- 使用长会话模式的漏洞接口注入获取锁
-
通过sqli-labs触发锁等待:
- 注入payload:
?id=1'|| GET_LOCK(1,5) ||' - 嵌套if语句:
?id=1'|| if(1,GET_LOCK(1,5),1) ||'
- 注入payload:
-
效果验证:
- 成功造成延时效果
- 不触发雷池WAF拦截
- 数据库监听工具确认延时和锁等待
4. WAF检测情况
- 锁函数被检测到但默认不拦截
- 常见延时函数(sleep、BENCHMARK)被拦截
五、总结与优势
-
技术优势:
- 不易被WAF检测(许多WAF默认不拦截锁函数)
- 在特定连接模式下非常有效
- 可与其他注入技术结合使用
-
适用场景:
- 连接池模式
- 用户级长连接模式
- 多Web共用数据库模式
-
防御建议:
- 限制或禁用
GET_LOCK函数权限 - 配置WAF规则检测锁函数的使用
- 优化数据库连接管理策略
- 限制或禁用
通过深入理解MySQL锁机制及其在不同Web架构中的应用,安全研究人员可以开发出更有效的注入技术,同时也帮助防御者更好地保护系统安全。