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. 核心特性

  1. 命名锁机制

    • 基于字符串名称的锁,不同锁名互不影响
    • 例如:GET_LOCK('test1', 10)GET_LOCK('test2', 10)互不干扰
  2. 会话级作用域

    • 一个会话获取锁后,其他会话尝试获取同名锁会被阻塞
    • 同一会话内多次请求相同锁不会阻塞,直接返回成功
  3. 锁释放规则

    • 显式释放:RELEASE_LOCK('lock_name')
    • 隐式释放:
      • 会话终止(连接关闭)
      • wait_timeout参数控制(默认值因版本而异,可能是8小时或2分钟)
    • 不会随事务结束自动释放(与InnoDB行锁不同)

三、Web应用中的数据库连接模式与利用条件

1. 利用条件

要成功利用锁机制进行延时注入,必须满足两个条件:

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

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. 锁机制延时注入步骤

  1. 通过MRCMS-3.1.2获取锁

    • 使用长会话模式的漏洞接口注入获取锁
  2. 通过sqli-labs触发锁等待

    • 注入payload:?id=1'|| GET_LOCK(1,5) ||'
    • 嵌套if语句:?id=1'|| if(1,GET_LOCK(1,5),1) ||'
  3. 效果验证

    • 成功造成延时效果
    • 不触发雷池WAF拦截
    • 数据库监听工具确认延时和锁等待

4. WAF检测情况

  • 锁函数被检测到但默认不拦截
  • 常见延时函数(sleep、BENCHMARK)被拦截

五、总结与优势

  1. 技术优势

    • 不易被WAF检测(许多WAF默认不拦截锁函数)
    • 在特定连接模式下非常有效
    • 可与其他注入技术结合使用
  2. 适用场景

    • 连接池模式
    • 用户级长连接模式
    • 多Web共用数据库模式
  3. 防御建议

    • 限制或禁用GET_LOCK函数权限
    • 配置WAF规则检测锁函数的使用
    • 优化数据库连接管理策略

通过深入理解MySQL锁机制及其在不同Web架构中的应用,安全研究人员可以开发出更有效的注入技术,同时也帮助防御者更好地保护系统安全。

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) ||' 效果验证 : 成功造成延时效果 不触发雷池WAF拦截 数据库监听工具确认延时和锁等待 4. WAF检测情况 锁函数被检测到但默认不拦截 常见延时函数(sleep、BENCHMARK)被拦截 五、总结与优势 技术优势 : 不易被WAF检测(许多WAF默认不拦截锁函数) 在特定连接模式下非常有效 可与其他注入技术结合使用 适用场景 : 连接池模式 用户级长连接模式 多Web共用数据库模式 防御建议 : 限制或禁用 GET_LOCK 函数权限 配置WAF规则检测锁函数的使用 优化数据库连接管理策略 通过深入理解MySQL锁机制及其在不同Web架构中的应用,安全研究人员可以开发出更有效的注入技术,同时也帮助防御者更好地保护系统安全。