浅谈SQL注入:常用手法及原理
字数 910 2025-08-10 17:51:51

SQL注入攻击:常用手法及原理详解

一、SQL注入概述

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行。

二、漏洞具体成因

1. 典型示例分析

以sqli-labs靶场less-1为例:

  • 从URL后以GET方式传入的参数被直接拼接到了后端MySQL查询语句中
  • 当传入参数中包含单引号和--+注释符时,可以改变原SQL语句的结构

2. 关键发现

  • 通过注入可以确定页面关联的数据库表有id、username、password三个字段
  • 前端页面有后两个字段的回显
  • 可以通过传入不存在的数据并使用union联合查询来获取信息

三、SQL注入类型

1. 数字型注入

  • 特征:参数两边没有单引号
  • 判断方法:参数可以进行运算

2. 字符型注入

  • 特征:参数两边有单引号
  • 判断方法:参数被视为字符串,无法进行运算

四、注入点判断方法

1. GET传参测试

  • 尝试更改参数值观察页面变化
  • 输入较大/不存在参数,观察输出是否空白
  • 尝试引发报错,观察错误信息是否与数据库相关

2. 字段数判断

  • 使用order by语句逐步测试
  • order by n报错时,说明字段数为n-1

五、常用注入手法

1. 联合查询(Union Select)

  • 关键点:查询语句字段数必须与原表相同
  • 示例:
    union select 1,database(),3
    

2. 利用information_schema数据库

  • MySQL 5.0.1+版本提供该数据库,存储所有数据库的元信息
  • 查询表名:
    select table_name from information_schema.tables 
    where table_schema=database()
    
  • 查询字段名:
    select group_concat(column_name) from information_schema.columns 
    where table_name='users' and table_schema=database()
    

3. 布尔盲注

  • 原理:通过页面返回的真/假状态判断条件
  • 示例:判断数据库名长度
    and length(database())=8
    
  • 逐字符判断:
    and ascii(substr(database(),1,1))=115
    

4. 延时注入

  • 适用场景:页面无回显信息
  • 示例:
    and If(ascii(substr(database(),1,1))=115,sleep(5),1)
    

5. 报错注入

  • 原理:利用数据库函数错误返回信息
  • 常用函数:extractvalue、updatexml等
  • 示例:
    and extractvalue(1,concat(0x7e,database()))
    

六、防御建议

  1. 使用参数化查询(预编译语句)
  2. 对输入进行严格的过滤和验证
  3. 最小权限原则,限制数据库用户权限
  4. 关闭错误回显
  5. 使用Web应用防火墙(WAF)

通过理解这些注入原理和手法,可以更好地防御SQL注入攻击,保护数据库安全。

SQL注入攻击:常用手法及原理详解 一、SQL注入概述 SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行。 二、漏洞具体成因 1. 典型示例分析 以sqli-labs靶场less-1为例: 从URL后以GET方式传入的参数被直接拼接到了后端MySQL查询语句中 当传入参数中包含单引号和 --+ 注释符时,可以改变原SQL语句的结构 2. 关键发现 通过注入可以确定页面关联的数据库表有id、username、password三个字段 前端页面有后两个字段的回显 可以通过传入不存在的数据并使用union联合查询来获取信息 三、SQL注入类型 1. 数字型注入 特征:参数两边没有单引号 判断方法:参数可以进行运算 2. 字符型注入 特征:参数两边有单引号 判断方法:参数被视为字符串,无法进行运算 四、注入点判断方法 1. GET传参测试 尝试更改参数值观察页面变化 输入较大/不存在参数,观察输出是否空白 尝试引发报错,观察错误信息是否与数据库相关 2. 字段数判断 使用 order by 语句逐步测试 当 order by n 报错时,说明字段数为n-1 五、常用注入手法 1. 联合查询(Union Select) 关键点:查询语句字段数必须与原表相同 示例: 2. 利用information_ schema数据库 MySQL 5.0.1+版本提供该数据库,存储所有数据库的元信息 查询表名: 查询字段名: 3. 布尔盲注 原理:通过页面返回的真/假状态判断条件 示例:判断数据库名长度 逐字符判断: 4. 延时注入 适用场景:页面无回显信息 示例: 5. 报错注入 原理:利用数据库函数错误返回信息 常用函数:extractvalue、updatexml等 示例: 六、防御建议 使用参数化查询(预编译语句) 对输入进行严格的过滤和验证 最小权限原则,限制数据库用户权限 关闭错误回显 使用Web应用防火墙(WAF) 通过理解这些注入原理和手法,可以更好地防御SQL注入攻击,保护数据库安全。