SQL注入漏洞全面学习笔记
一、基础认知篇(定义 + 原理 + 危害)
1. 漏洞定义
SQL 注入官方定义、核心触发条件
- 漏洞本质:用户可控参数未过滤 / 过滤不严格,拼接进入 SQL 语句执行
- 漏洞常见位置:GET/POST 参数、Cookie、HTTP 头、搜索框、订单 ID、用户输入等
2. 触发原理
- 动态 SQL 拼接代码示例(PHP/Java/Python)
- 正常 SQL 与注入后 SQL 的结构对比
- 单引号 / 双引号闭合原理、注释符截断作用
- 语句执行逻辑改变(条件恒真、 Union 查询、执行多语句)
3. 漏洞危害等级与影响
- 数据泄露:库名、表名、字段、用户密码、敏感业务数据
- 数据篡改:修改账号权限、订单金额、用户信息
- 数据删除:删库、删表、删数据
- 服务器接管:读写文件、执行系统命令(高权限场景)
- 权限提升、内网渗透、业务瘫痪
4. 漏洞分类
- 按注入点数据类型:数字型、字符型、搜索型
- 按执行方式:联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入
- 按提交方式:GET 注入、POST 注入、Cookie 注入、HTTP 头部注入
- 按防护绕过:宽字节注入、编码注入、过滤绕过注入
二、前置知识篇(必备 SQL 与环境)
1. 核心 SQL 语法(注入必背)
- 查询:
SELECT、WHERE、GROUP BY、ORDER BY - 联合查询:
UNION/UNION ALL - 系统库查询:
information_schema(MySQL) - 注释:
--、#、/**/ - 字符串函数:
concat()、substr()、mid()、length()、ascii() - 报错函数:
extractvalue()、updatexml()、floor(rand()*2) - 多语句执行:
;分隔(堆叠注入) - 文件读写:
load_file()、into outfile/into dumpfile
2. 主流数据库差异
- MySQL、MSSQL、Oracle、PostgreSQL、SQLite
- 系统表、注释符、报错函数、权限函数、文件操作差异
- 盲注与联合查询的语法适配点
3. 测试环境搭建
- 靶场:DVWA、SQLi-Labs、BWAPP、WebGoat、自建漏洞环境
- 本地环境:PHP+MySQL、Python Flask+SQLite、Java+MySQL
- 代理工具:Burp Suite、浏览器插件
三、漏洞检测与判断篇
1. 手工检测流程
- 寻找用户可控参数
- 插入特殊字符:
'、"、)、;、()观察报错 - 判断注入类型:数字型 / 字符型 / 搜索型
- 判断闭合方式:单引号、双引号、括号组合
- 验证可执行性:
and 1=1、and 1=2、order by 1,2,3...
2. 自动检测工具
- SQLmap 核心用法、参数、配置
- DSSS、Burp 主动 / 被动扫描插件
- 工具检测与手工验证结合思路
3. 有无回显判断
- 有显错:直接报错注入、联合查询
- 无显错但有页面差异:布尔盲注
- 无页面差异:时间盲注
- 无回显、无延迟:堆叠注入、二次注入、带外注入
四、主流注入利用手法(核心实战模块)
1. 联合查询注入(Union Inject)
- 适用场景:页面有数据回显
- 步骤:判断列数 → 判断回显位 → 查询库名 → 查表名 → 查字段 → 查数据
- 标准 Payload 模板
- 限制条件:前后查询列数一致、数据类型兼容
2. 报错注入(Error-based Inject)
- 适用场景:页面打印 SQL 错误信息
- MySQL 常用函数:
updatexml、extractvalue、floor - 构造思路:构造语法错误带出查询结果
- 常用 Payload 与拆解
3. 布尔盲注(Boolean Blind)
- 适用场景:无数据回显、无报错,仅存在 True/False 页面差异
- 核心逻辑:逐字符猜解(长度→ASCII / 字符)
- 常用函数:
length()、substr()、ascii()、ord() - 手工流程与脚本自动化思路
4. 时间盲注(Time Blind)
- 适用场景:无任何可见差异,仅通过延迟判断
- 延时函数:
sleep(n)、benchmark()、waitfor delay - 条件延时语句结构
- 脚本批量猜解模板
5. 堆叠注入(Stacked Queries)
- 原理:
;分隔执行多条 SQL - 适用场景:数据库 / 驱动支持多语句(如 MySQL+PHP 原生、MSSQL)
- 用途:读库、改表、删数据、写文件、创建用户
6. 其他特殊注入
- 宽字节注入:GBK 编码、
%df'绕过单引号转义 - 搜索型注入:
%' and 1=1 and '%闭合 - 二次注入:入库未过滤、查询时触发
- 带外注入(OOB):DNS/HTTP 带出数据(
load_file+dnslog) - Cookie 注入、User-Agent 注入、Referer 注入
五、WAF / 过滤绕过篇(进阶核心)
1. 常见过滤规则
- 关键字过滤:
select、union、from、where、information_schema - 符号过滤:单引号、空格、
=、>、<、--、# - 函数过滤:
sleep、substr、extractvalue - 请求特征拦截:异常参数、Payload 特征
2. 通用绕过手法
- 大小写混淆:
SelECt、UNioN - 注释穿插:
sel/**/ect、unio%00n - 编码绕过:URL 编码、Unicode、十六进制、双重编码
- 等价函数替换:
substr↔mid↔substring、=↔like/regexp - 空格替换:
/**/、%09、%0a、%0b、() - 字符串拼接:
concat、char()、hex编码字符串 - 内联注释:
/*!select*/(MySQL 特性)
3. 分层绕过思路
- 第一层:参数接收端(应用层过滤)
- 第二层:WAF/IDS/IPS 规则
- 第三层:数据库解析层特性
- 多层组合绕过 Payload 构造
六、高权限利用:文件读写与命令执行
1. 文件读取
- MySQL:
load_file()前提条件 - 路径:网站路径、系统配置文件、日志文件、密钥文件
- 绝对路径获取手法
2. 文件写入
into outfile、into dumpfile- 写入 Webshell 条件与路径
- 常见写入位置与绕过写入限制
3. 命令执行边界
- SQL 注入→写马→Webshell→命令执行
- 不同数据库命令执行差异
- 权限限制与提权思路
七、代码审计篇(从源码定位漏洞)
1. 不同语言漏洞代码特征
- PHP:
mysql_query、拼接$_GET/$_POST、无预处理 - Java:JDBC 原生拼接、Statement、无 PreparedStatement
- Python:原生拼接 SQL 字符串、未使用参数化查询
- ASP/ASP.NET:拼接 SQL 语句
2. 危险函数 / 关键字定位
- 直接拼接 SQL 的函数、无过滤的参数接收点
- 过滤函数弱校验:仅
str_replace、单层过滤、可绕过
3. 审计流程
- 确定入口参数 → 追踪参数传递 → 检查过滤逻辑 → 查看 SQL 拼接点 → 构造 Payload 验证
八、防护与修复篇(开发 + 运维双维度)
1. 代码层最优方案
- 预编译语句 / 参数化查询(PreparedStatement/PDO)
- 不同语言参数化写法示例
- 禁止字符串直接拼接 SQL
2. 输入过滤与校验
- 白名单校验(仅允许指定字符、格式)
- 数据类型强制转换(数字型参数强转 int)
- 关键字黑名单(补充防护,非核心)
3. 权限最小化
- 数据库账号禁止 File、Drop、Alter 等高权限
- 禁止 Web 应用使用 root/SA 账号连接数据库
- 限制跨库查询、文件操作权限
4. 中间件与 WAF 防护
- 部署 WAF / 云防护规则
- 关闭数据库错误回显
- 日志审计、异常请求监控
- 关键操作二次验证
5. 常见错误防护
- 仅转义单引号(可被宽字节、编码绕过)
- 仅黑名单过滤关键字
- 高权限数据库连接账号
- 开启错误回显暴露结构
九、工具与自动化篇
1. SQLmap 系统化笔记
- 基础参数:
-u、-p、--data、-r - 注入类型指定:
--technique - 库表字段获取:
--dbs、--tables、--columns、--dump - 绕过参数:
--tamper - 文件读写:
--file-read、--file-write - 批量扫描与优化
2. 辅助工具
- Burp Suite:抓包、重放、爆破盲注
- Dnslog 平台:OOB 注入验证
- 自编 Python 脚本:盲注批量猜解
十、实战题型与 CTF/SRC 总结
1. 常见场景
- 登录框注入、搜索框注入、ID 参数注入
- 分页、排序、筛选功能注入(
order by注入) - 二次注入、注册→登录触发
- 无回显盲注、编码注入、WAF 绕过
2. SRC / 渗透测试流程
- 信息收集→找参数→手工测试→工具验证→数据获取→权限提升→报告编写
- 漏洞等级判定、修复建议书写模板
3. 易错点与坑点
UNION需要列数、类型匹配- 盲注脚本字符集、编码问题
- 高版本 MySQL
information_schema权限限制 - 无文件读写权限、GPC 开启、安全模式限制