文章目录
- [SQL 注入高级形态【思路精简版】](#SQL 注入高级形态【思路精简版】)
-
- [一、SQL 二次注入(Second-Order Injection)](#一、SQL 二次注入(Second-Order Injection))
- [二、堆叠注入(Stacked Queries)](#二、堆叠注入(Stacked Queries))
-
- 核心属性
- 必要条件(缺一不可)
- [快速判断点(PHP 场景)](#快速判断点(PHP 场景))
- 实战定位思路
- [三、DNSLog 带外注入(OOB Injection)](#三、DNSLog 带外注入(OOB Injection))
- 四、三类注入的"思路级对比"
- 五、实战总口诀(记住这个即可)
SQL 注入高级形态【思路精简版】
本版本为思路 / 属性 / 判断逻辑提炼版,用于实战与复盘快速定位,不追求 Payload 细节与代码展开。
一、SQL 二次注入(Second-Order Injection)
核心属性
- 注入不在输入点触发
- 恶意数据先被存入数据库
- 在后续功能中被再次拼接进 SQL 才触发
一句话本质:
程序错误地信任了"数据库里的数据"。
触发链路(最重要)
用户可控输入
↓
INSERT(插入时被转义 / 看似安全)
↓
程序取出数据
↓
SELECT / UPDATE 中字符串拼接
↓
注入触发
必要条件判断
- 插入阶段:
- ❌ 不能直接注入(否则是一阶注入)
- ✅ 恶意数据可以"作为字符串"成功入库
- 使用阶段:
- 存储的数据被直接拼接进 SQL
- 没有再次使用预编译 / 绑定参数
黑盒 / 白盒快速判断
- 黑盒 :
- 是否存在"添加 / 修改 → 查看 / 再编辑"的功能闭环
- 白盒 :
- 是否存在
insert后进入select / update - 是否使用字符串拼接 SQL
- 是否存在
二、堆叠注入(Stacked Queries)
核心属性
- 一次请求执行多条 SQL
- 利用
;结束当前语句并继续执行
一句话本质:
程序允许数据库执行"多语句查询"。
必要条件(缺一不可)
- 存在 SQL 注入
- 未过滤
; - 中间层支持多语句执行
第 3 条是核心门槛。
快速判断点(PHP 场景)
- ❌
mysqli_query()→ 基本不可堆叠 - ✅
mysqli_multi_query()→ 高危
实战定位思路
- CMS / 框架中:
- 搜索 multi / batch / exec 类数据库接口
- CTF 中:
- 尝试
;show databases判断是否成立
- 尝试
三、DNSLog 带外注入(OOB Injection)
解决的问题
- 无回显
- 无报错
- 盲注效率极低
一句话定位:
看不到结果时,把数据"送出去"。
核心思路公式
敏感数据
+ 攻击者可控域名
→ 目标服务器发起 DNS 解析
→ 攻击者日志中得到数据
注入成立的关键前提(MySQL)
- 高权限用户(常见 root)
- 支持
load_file() secure_file_priv不为NULL
记忆判断:
NULL 禁止,空最好,有路径则受限。
技术本质
- 利用 Windows UNC 路径
- 借助 DNS 解析的"被动外带"特性
- 一次请求通常只能带回一个字段
适用场景判断
- 页面完全无回显
- 但可以确定 SQL 被执行
- 比时间盲注更稳定时优先考虑
四、三类注入的"思路级对比"
| 类型 | 核心信任错误 | 关键判断点 | 更偏向 |
|---|---|---|---|
| 二次注入 | 信任数据库数据 | insert → 再使用 | 白盒 |
| 堆叠注入 | 信任分号 | 是否多语句执行 | CTF / 白盒 |
| DNSLog | 信任无回显即安全 | 是否可外带 | 黑盒 |
五、实战总口诀(记住这个即可)
- 二次注入:数据什么时候被用第二次?
- 堆叠注入:数据库能不能一次跑多句?
- DNSLog:现在有没有任何"东西"能被带出去?
不要急着写 Payload,先判断"注入形态是否成立"。