SQL注入漏洞全面学习笔记

约 13 分钟读完

一、基础认知篇(定义 + 原理 + 危害)

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 语法(注入必背)

    • 查询:SELECTWHEREGROUP BYORDER 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. 手工检测流程

    1. 寻找用户可控参数
    2. 插入特殊字符:'");() 观察报错
    3. 判断注入类型:数字型 / 字符型 / 搜索型
    4. 判断闭合方式:单引号、双引号、括号组合
    5. 验证可执行性:and 1=1and 1=2order by 1,2,3...

    2. 自动检测工具

    • SQLmap 核心用法、参数、配置
    • DSSS、Burp 主动 / 被动扫描插件
    • 工具检测与手工验证结合思路

    3. 有无回显判断

    • 有显错:直接报错注入、联合查询
    • 无显错但有页面差异:布尔盲注
    • 无页面差异:时间盲注
    • 无回显、无延迟:堆叠注入、二次注入、带外注入

    四、主流注入利用手法(核心实战模块)

    1. 联合查询注入(Union Inject)

    • 适用场景:页面有数据回显
    • 步骤:判断列数 → 判断回显位 → 查询库名 → 查表名 → 查字段 → 查数据
    • 标准 Payload 模板
    • 限制条件:前后查询列数一致、数据类型兼容

    2. 报错注入(Error-based Inject)

    • 适用场景:页面打印 SQL 错误信息
    • MySQL 常用函数:updatexmlextractvaluefloor
    • 构造思路:构造语法错误带出查询结果
    • 常用 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. 常见过滤规则

    • 关键字过滤:selectunionfromwhereinformation_schema
    • 符号过滤:单引号、空格、=><--#
    • 函数过滤:sleepsubstrextractvalue
    • 请求特征拦截:异常参数、Payload 特征

    2. 通用绕过手法

    • 大小写混淆:SelECtUNioN
    • 注释穿插:sel/**/ectunio%00n
    • 编码绕过:URL 编码、Unicode、十六进制、双重编码
    • 等价函数替换:substrmidsubstring=like/regexp
    • 空格替换:/**/%09%0a%0b()
    • 字符串拼接:concatchar()hex编码字符串
    • 内联注释:/*!select*/(MySQL 特性)

    3. 分层绕过思路

    • 第一层:参数接收端(应用层过滤)
    • 第二层:WAF/IDS/IPS 规则
    • 第三层:数据库解析层特性
    • 多层组合绕过 Payload 构造

    六、高权限利用:文件读写与命令执行

    1. 文件读取

    • MySQL:load_file() 前提条件
    • 路径:网站路径、系统配置文件、日志文件、密钥文件
    • 绝对路径获取手法

    2. 文件写入

    • into outfileinto 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 开启、安全模式限制
← 学完OWASP Top10,我竟陷入了网络安全人的“无力困境” 短信验证码功能进行安全测试 →