SQL 注入:原理、入侵过程与防御对照
admin
2026-10-26 16:21
34人看过
免费
# SQL注入:原理、入侵过程与防御对照|红蓝对抗演练视角
> 核心一句话:**将用户可控输入直接拼入SQL语句,破坏原有SQL语法结构;攻击者篡改数据库查询逻辑,实现查询数据、读写文件、接管数据库服务器。**
## 一、原理拆解
后端直接拼接用户传入参数,构造SQL语句交给数据库执行。
❌危险代码示例
```php
$name = $_GET['username'];
$sql = "SELECT * FROM user WHERE username = '$name' AND password = '$pwd'";
```
攻击者传入 payload:`username=admin' or '1'='1'--`
拼接后SQL变成:
```sql
SELECT * FROM user WHERE username = 'admin' or '1'='1'--' AND password = '$pwd'
```
`--` 代表SQL注释,后面语句全部忽略;`or '1'='1'`恒成立,直接查询全部用户,可实现登录绕过。
### 注入分类(演练常考)
1. **联合查询注入 union select**:有回显,把额外查询结果拼在页面输出,直接拖库。
2. **布尔盲注**:页面只有两种状态(正常/报错),没有直接数据回显,逐字符猜数据。
3. **时间盲注**:页面无任何差异,使用`sleep()`延时,根据响应时间判断条件真假。
4. **报错注入**:利用数据库报错机制,将查询数据在错误信息中输出。
5. **堆叠注入**:执行多条SQL语句(`;`分隔),新增/删除数据、创建账户。
## 二、完整入侵链路
1. 探测:寻找GET/POST参数、Cookie参数,输入单引号`'`,观察页面是否报错/异常,判断是否存在SQL注入。
2. 确定注入点类型:判断是否有回显,区分联合/布尔/时间盲注。
3. 信息搜集:查询数据库版本、库名、表名、字段名。
4. 数据拖取:读取表内敏感数据(手机号、账号密码),也就是拖库。
5. 权限提升:
- 高权限数据库账号,可读写服务器本地文件(`load_file`、`into outfile`写入webshell)
- 数据库开启`xp_cmdshell`(MSSQL)直接执行系统命令RCE
6. 获取服务器立足点,本机提权、抓取凭据,进入内网横向渗透。
### 基础Payload示例
```
# 测试单引号
?user=admin'
# union联合查询,获取版本
?user=-1' union select 1,version(),database()-- -
# 布尔盲注
?user=admin' and substr(database(),1,1)='a'-- -
# 时间盲注
?user=admin' and sleep(5)-- -
```
## 三、蓝队审计 & 检测
### 白盒审计重点
1. 查找直接拼接用户输入到SQL语句的代码。
2. 优先检查:JDBC拼接字符串、PHP字符串拼接SQL。
3. 安全写法:**预编译语句(参数化查询,PreparedStatement)**
### 流量&日志特征
- 请求参数携带 `' " or and union select sleep() -- #` 等SQL关键字与注释符
- 数据库大量异常报错日志、大量时间延迟请求(时间盲注)
- 批量遍历查询表/字段,大量union查询特征请求
## 四、防御对照(优先级由高到低)
✅【首选:参数化预编译查询】
SQL语句结构固定,外部输入仅作为**参数值**,不会被数据库解析为SQL语法。从根源杜绝注入。
> Java JDBC、PHP PDO、Python pymysql都支持预编译。
✅【输入校验(白名单)】
例如ID只允许数字;对输入格式做校验,黑名单容易被编码、大小写绕过,不作为主防护。
✅【最小权限原则】
Web连接数据库账号只分配查询业务表权限;**禁止file、xp_cmdshell等高权限**。就算注入成功,限制危害范围。
✅【关闭数据库报错回显】
页面不要输出原始数据库报错信息,防止报错注入泄露库表信息(仅辅助防护,不能阻止注入)
✅【WAF】
拦截注入特征流量,属于外层防护,可以被编码、变形绕过,**不能单独依靠WAF**。
## 五、高频易混考点
1. SQL注入属于**数据库层面漏洞**;越权属于业务逻辑漏洞,二者分开。
2. 预编译是根治手段;**黑名单过滤、转义都属于辅助,存在绕过风险**。
3. 堆叠注入依靠分号`;`,部分数据库/驱动不支持多条语句执行。
4. 时间盲注没有页面回显,依靠响应延时判断,隐蔽性更强。
一句话速记:
SQL注入根源是外部输入直接拼接SQL语句;分为联合、布尔、时间、报错注入;根治方案是**预编译参数化查询,数据库账号最小权限**。
版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载或以其他方式使用本站原创内容。