SQL 注入入门 —— 原理、分类与注入点判断
什么是 SQL 注入
SQL 注入就是把恶意的 SQL 命令插入到网站的输入框(账号/密码/搜索等),让服务器执行这些恶意命令,从而获取甚至篡改数据库里的敏感数据。
注入分类
1. 按查询字段类型分
| 类型 | 定义 | 特点 |
|---|---|---|
| 字符型注入 | 输入的参数是字符串(带引号) | 必须用引号闭合,如 ' or 1=1# |
| 数字型注入 | 输入的参数是整数(无引号) | 直接拼接 SQL,如 id=1 and 1=1 |
2. 按注入方法分(核心 4 种)
| 方法 | 核心逻辑 | 特点 |
|---|---|---|
| Union 注入 | 利用 UNION 合并多条查询结果 |
能直接把数据查出来,最常用 |
| 报错注入 | 故意让 SQL 报错,把数据显示在错误信息里 | 不用回显位,靠报错拿数据 |
| 布尔注入 | 靠页面是否显示成功/失败来猜数据 | 页面只回显”成功/失败”,慢慢猜 |
| 时间注入 | 靠页面响应时间来推断数据 | 无回显时用,靠 sleep(5) 等函数 |
注入点
什么是注入点
用户输入能直接拼接到后台 SQL 语句并被数据库执行的入口。本质上就是人机交互的地方。
常见注入点位置
| 位置 | 示例 |
|---|---|
| GET 请求参数 | URL 中 ?id=1、?name=test |
| POST 请求参数 | 登录框、搜索框、表单提交 |
| HTTP 请求头 | Cookie、User-Agent、Referer |
判断注入点的方法
- 数字型:
id=1 AND 1=1正常,id=1 AND 1=2异常 - 字符型:输入
'页面报错 → 存在字符型注入
闭合方式
| 类型 | 原始拼接方式 | 是否需要闭合符 | 注入输入示例 |
|---|---|---|---|
| 字符型 | id='$id' |
✅ | 1' and 1=1--+ |
| 数字型 | id=$id |
❌ | 1 and 1=2 |
常见闭合符号
' " ') '') 等
判断闭合三步骤
第一步:测试单引号 '
- 提交
?id=1' - 报错 → 单引号闭合 ✓
- 正常 → 继续下一步
第二步:测试双引号 "
- 提交
?id=1" - 报错 → 双引号闭合 ✓
- 正常 → 大概率是数字型
第三步:验证数字型
- 提交
?id=1 and 1=2 - 页面无数据/异常 → 数字型
- 正常 → 考虑括号等特殊闭合
常用注释符
| 符号 | 说明 |
|---|---|
--+ |
最常用,适配 URL 传参 |
# |
MySQL 原生注释 |
%23 |
# 的 URL 编码形式 |
防护核心
- 对所有用户输入做严格过滤
- 使用预编译语句(Prepared Statement)
- 避免直接拼接 SQL
https://yjz-miao.github.io/2026/05/17/Web%E5%AE%89%E5%85%A8/SQL%E6%B3%A8%E5%85%A5%E5%85%A5%E9%97%A8/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 YJZ's Security Lab!