SQL注入的原理和危害
字数 2133 2025-08-12 11:34:43
SQL注入原理与防御全面指南
一、SQL注入概述
SQL注入(Structured Query Language Injection)是一种针对Web应用程序的安全漏洞攻击技术,攻击者通过在Web表单输入恶意构造的SQL命令,欺骗服务器执行非预期的数据库操作。
危害性
- 恶意获取数据库敏感信息
- 篡改数据库内容
- 绕过身份验证机制
- 执行数据库管理员操作
- 网页内容篡改
- 服务器文件系统访问
二、SQL注入原理
核心原理:由于程序未对用户输入进行充分过滤,导致恶意SQL语句被拼接执行。
攻击流程:
- 判断注入类型
- 确定字段数量
- 识别显示位
- 构造有效payload
- 获取数据库信息
三、SQL注入分类
按参数类型分类
- 数字型注入:参数未经处理直接用于数字查询
- 字符型注入:参数作为字符串处理,需闭合引号
- 搜索型注入:用于搜索功能的注入
按注入方法分类
- 基于报错的注入:利用数据库错误信息获取数据
- 基于布尔的盲注:通过页面返回真假状态推断数据
- 基于时间的盲注:通过延时响应判断条件真假
- 联合查询注入:使用UNION合并查询结果
- 堆叠注入:执行多条SQL语句(使用分号分隔)
- 内联查询注入:在原有查询中嵌入新查询
- 宽字节注入:利用字符编码转换绕过过滤
按提交方式分类
- GET注入:通过URL参数提交
- POST注入:通过表单数据提交
- COOKIE注入:通过HTTP Cookie提交
- HTTP头注入:通过HTTP头部字段提交
四、SQL注入利用思路
1. 目标识别
- 寻找可能存在漏洞的站点
- 通过后缀判断数据库类型:
- .asp → Access
- .aspx → MS SQL
- .php → MySQL
- .jsp → Oracle
2. 注入点探测
- URL参数测试(追加单引号等特殊字符)
- POST表单测试
- 使用BurpSuite等工具检测Cookie注入
3. 注入类型判断
- 数字型:使用减法运算测试(如?id=2-1)
- 字符型:通过单引号和报错信息判断
4. 注入技术选择
- 有回显无显示位:使用报错注入(floor(), exp(), updatexml(), extractvalue())
- 无明确回显但有差异响应:布尔盲注(ascii(), substr(), length(), concat())
- 无任何回显:时间盲注(sleep())
五、特殊注入技术详解
宽字节注入
原理:PHP连接MySQL时设置"character_set_client=gbk"导致编码转换问题,使反斜杠转义失效。
绕过方式:
- 提交%df%5c,在GBK编码下转换为"運"字,绕过单引号闭合
防御:
- 使用addslashes()函数
- 使用mysql_real_escape_string()函数
堆叠注入
原理:使用分号(;)分隔执行多条SQL语句,比UNION注入更灵活。
条件:
- 存在SQL注入漏洞
- 未过滤分号
- 数据库支持多语句执行(PHP需mysqli_multi_query())
示例:
?id=1;INSERT INTO users(id,username,password) VALUES(12,'jack','testjack')--+
二次注入
原理:恶意数据先被存储,后从数据库读取时触发注入。
步骤:
- 插入恶意数据(转义处理但存储原始数据)
- 引用恶意数据(未二次过滤)
防御:
- 使用预处理和数据绑定
- 对所有数据流动进行检测过滤
联合查询注入
原理:利用UNION合并查询结果获取数据。
步骤:
- 判断字段数
- 确定显示位
- 构造payload
示例:
?id=1' UNION SELECT 1,2,3 --
?name=1xxxx' UNION SELECT group_concat(schema_name),2 FROM information_schema.schemata--+
前提条件:
- 前一个查询结果为空
- UNION前后查询字段数相同
Cookie注入
通过修改HTTP Cookie中的参数值实现注入,原理与常规SQL注入相同。
HTTP头注入(User-Agent)
在User-Agent字段中插入恶意SQL代码。
文件读写注入
原理:利用数据库文件读写功能。
读文件前提:
- 知道文件路径
- 有UNION查询能力
- web目录有写权限
- mysql.ini中secure-file-priv=''
写文件前提:
- 知道存储位置
- 有写权限
- 未过滤单引号
- 可使用into_outfile()函数
六、防御措施
-
输入验证:
- 严格过滤特殊字符
- 使用正则表达式验证输入格式
-
参数化查询:
- 使用预处理语句(PDO/mysqli)
- 数据绑定技术
-
最小权限原则:
- 数据库用户仅授予必要权限
- 避免使用root账户
-
错误处理:
- 禁用详细错误信息
- 自定义错误页面
-
安全函数:
- addslashes()
- mysql_real_escape_string()
- htmlspecialchars()
-
WAF防护:
- 部署Web应用防火墙
- 过滤UNION等关键字
-
编码规范:
- 使用ORM框架
- 避免直接拼接SQL
-
定期审计:
- 代码安全审查
- 渗透测试
七、通用注入流程
-
发现注入点:
- 测试所有输入点
- 判断GET/POST类型
-
识别数据库:
- 利用各数据库特有函数/特性
- 通过错误信息判断
-
信息收集:
- 选择合适的注入技术
- 构造有效payload
- 逐步获取数据库结构信息
通过全面理解SQL注入的原理、分类和防御措施,开发人员可以构建更安全的Web应用程序,安全人员也能更有效地识别和防范此类攻击。