浅谈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()))
六、防御建议
- 使用参数化查询(预编译语句)
- 对输入进行严格的过滤和验证
- 最小权限原则,限制数据库用户权限
- 关闭错误回显
- 使用Web应用防火墙(WAF)
通过理解这些注入原理和手法,可以更好地防御SQL注入攻击,保护数据库安全。