面试题sql注入的分类概念性总结
字数 1895 2025-08-15 21:34:03

SQL注入分类与攻击技术详解

1. SQL注入基础概念

SQL注入是一种将恶意SQL代码插入或添加到应用程序输入参数中的攻击技术,攻击者通过这些参数欺骗数据库服务器执行非预期的SQL命令。

注入点类型判断

  • 整型注入:无需引号闭合,直接拼接SQL语句

    1 and 1=1#
    1 and 1=2#
    
  • 字符型注入

    • 单引号注入:1' or '1'='1
    • 双引号注入:1" or "1"="1

2. SQL注入主要分类

2.1 联合查询注入(Union Query Injection)

使用场景:页面上有显示位(数据展示位置)

关键技术点

  1. 判断列数:order by x
  2. 确定显示位:-1' union select 1,2,3
  3. 常用函数:
    • concat()/concat_ws():拼接多列
    • group_concat():多行结果合并为一行

典型Payload

-1' union select 1,2,database()#
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

2.2 报错型注入(Error-based Injection)

使用场景:页面无显示位但有SQL错误信息输出

主要技术

  1. ExtractValue()

    select ExtractValue('<a><b><b/></a>', concat('~', (select database())));
    
  2. UpdateXML()

    select updatexml('test', concat('~', (select version())), 'test');
    
  3. Floor()

    select count(*) from information_schema.tables group by concat(database(),floor(rand(0)*2));
    
  4. 其他报错函数

    • geometrycollection()
    • multipoint()
    • polygon()
    • exp() (当值>709时报错)

注意

  • 输出字符长度限制32位,可用mid()/substr()分割
  • 不能使用group_concat(),需用limit x,1

2.3 布尔盲注(Boolean-based Blind Injection)

使用场景:无显示位和错误信息,只能通过页面返回是否正常判断

攻击步骤

  1. 数据库信息

    • 数据库个数:count()
    • 数据库名长度:length()
    • 数据库名:substr()+ascii()
  2. 表信息

    • 表个数:count()
    • 表名长度:length()
    • 表名:substr()+ascii()
  3. 字段信息

    • 字段个数:count()
    • 字段名长度:length()
    • 字段名:substr()+ascii()
  4. 数据内容

    • 记录数:count(*)
    • 内容长度:length()
    • 内容:substr()+ascii()

常用函数

  • ORD():返回ASCII码
  • MID():截取字符串
  • IFNULL():NULL值处理
  • CAST():类型转换

2.4 时间盲注(Time-based Blind Injection)

使用场景:页面无任何差异,通过延时判断

关键技术

  • sleep(5):延时5秒
  • BENCHMARK():重复计算消耗时间
  • 笛卡尔积制造延时
  • if(condition, true_part, false_part)

典型Payload

1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+
1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+

2.5 二次注入(Second-order Injection)

原理:已存储的恶意数据被读取后再次进入SQL查询

特点

  • 第一次注入时特殊字符被转义
  • 存储时数据被还原
  • 第二次查询时未转义导致注入

防御:插入和读取时都需转义

2.6 堆叠注入(Stacked Queries Injection)

原理:利用分号执行多条SQL语句

条件

  • 支持多语句执行(如PHP的mysqli_multi_query
  • 通常需要已知数据库结构

利用方式

  • DNSLog数据外带(需load_file()权限)
  • 开启日志Getshell(需Web绝对路径和写权限)

2.7 宽字节注入(Wide-character Injection)

条件

  • 使用GBK等宽字符编码
  • 单引号被转义为\'(%5c%27)

原理%df%5c被解析为汉字,使单引号逃逸

Payload

id=-1%DF' union select 1,user(),3%23

防御:设置mysql_query为binary模式

2.8 HTTP头部注入(HTTP Header Injection)

常见注入点

  • User-Agent
  • Cookie
  • X-Forwarded-For
  • Referer
  • Host

原因:未过滤用户输入的HTTP头参数

防御

  • 过滤回车换行(%0d%0a)
  • 限制参数长度和合法性

3. 防御措施

  1. 使用参数化查询/预处理语句
  2. 对输入进行严格过滤和转义
  3. 最小权限原则,限制数据库账户权限
  4. 关闭错误信息显示
  5. 使用Web应用防火墙(WAF)
  6. 定期更新和修补系统

4. 总结

SQL注入攻击技术多样,从简单的联合查询到复杂的盲注技术,攻击者不断寻找新的利用方式。防御需要从代码编写、数据库配置、系统维护等多方面入手,建立全面的安全防护体系。

SQL注入分类与攻击技术详解 1. SQL注入基础概念 SQL注入是一种将恶意SQL代码插入或添加到应用程序输入参数中的攻击技术,攻击者通过这些参数欺骗数据库服务器执行非预期的SQL命令。 注入点类型判断 整型注入 :无需引号闭合,直接拼接SQL语句 字符型注入 : 单引号注入: 1' or '1'='1 双引号注入: 1" or "1"="1 2. SQL注入主要分类 2.1 联合查询注入(Union Query Injection) 使用场景 :页面上有显示位(数据展示位置) 关键技术点 : 判断列数: order by x 确定显示位: -1' union select 1,2,3 常用函数: concat() / concat_ws() :拼接多列 group_concat() :多行结果合并为一行 典型Payload : 2.2 报错型注入(Error-based Injection) 使用场景 :页面无显示位但有SQL错误信息输出 主要技术 : ExtractValue() UpdateXML() Floor() 其他报错函数 : geometrycollection() multipoint() polygon() exp() (当值>709时报错) 注意 : 输出字符长度限制32位,可用 mid() / substr() 分割 不能使用 group_concat() ,需用 limit x,1 2.3 布尔盲注(Boolean-based Blind Injection) 使用场景 :无显示位和错误信息,只能通过页面返回是否正常判断 攻击步骤 : 数据库信息 : 数据库个数: count() 数据库名长度: length() 数据库名: substr()+ascii() 表信息 : 表个数: count() 表名长度: length() 表名: substr()+ascii() 字段信息 : 字段个数: count() 字段名长度: length() 字段名: substr()+ascii() 数据内容 : 记录数: count(*) 内容长度: length() 内容: substr()+ascii() 常用函数 : ORD() :返回ASCII码 MID() :截取字符串 IFNULL() :NULL值处理 CAST() :类型转换 2.4 时间盲注(Time-based Blind Injection) 使用场景 :页面无任何差异,通过延时判断 关键技术 : sleep(5) :延时5秒 BENCHMARK() :重复计算消耗时间 笛卡尔积制造延时 if(condition, true_part, false_part) 典型Payload : 2.5 二次注入(Second-order Injection) 原理 :已存储的恶意数据被读取后再次进入SQL查询 特点 : 第一次注入时特殊字符被转义 存储时数据被还原 第二次查询时未转义导致注入 防御 :插入和读取时都需转义 2.6 堆叠注入(Stacked Queries Injection) 原理 :利用分号执行多条SQL语句 条件 : 支持多语句执行(如PHP的 mysqli_multi_query ) 通常需要已知数据库结构 利用方式 : DNSLog数据外带(需 load_file() 权限) 开启日志Getshell(需Web绝对路径和写权限) 2.7 宽字节注入(Wide-character Injection) 条件 : 使用GBK等宽字符编码 单引号被转义为 \' (%5c%27) 原理 : %df%5c 被解析为汉字,使单引号逃逸 Payload : 防御 :设置 mysql_query 为binary模式 2.8 HTTP头部注入(HTTP Header Injection) 常见注入点 : User-Agent Cookie X-Forwarded-For Referer Host 原因 :未过滤用户输入的HTTP头参数 防御 : 过滤回车换行(%0d%0a) 限制参数长度和合法性 3. 防御措施 使用参数化查询/预处理语句 对输入进行严格过滤和转义 最小权限原则,限制数据库账户权限 关闭错误信息显示 使用Web应用防火墙(WAF) 定期更新和修补系统 4. 总结 SQL注入攻击技术多样,从简单的联合查询到复杂的盲注技术,攻击者不断寻找新的利用方式。防御需要从代码编写、数据库配置、系统维护等多方面入手,建立全面的安全防护体系。