攻击原理与注入分类
SQL 注入的根本原因在于应用程序将用户输入与 SQL 语句拼接为一个字符串,数据库引擎无法区分「代码(SQL 关键字)」与「数据(参数值)」。这一设计缺陷与缓冲区溢出、XSS 同属「解释器注入」大类——任何将不可信数据作为代码传入解释器的行为都存在注入风险。
经典 SQLi 类型
-
基于错误的注入(Error-Based):利用数据库的错误回显来逐段抽取数据。攻击者构造一个必定触发类型转换错误的子查询,错误消息中暴露子查询的返回值。MySQL、SQL Server 和 PostgreSQL 的错误消息机制各有不同,但攻击原理一致——将错误消息转化为数据传输通道。
-
基于布尔的盲注(Boolean-Based Blind):页面不返回数据内容和错误信息,但返回「正常」与「异常」两种不同的 HTTP 响应(如 200 vs 500,或不同的页面长度)。攻击者逐位(bit-by-bit)推断数据:
AND SUBSTRING(password,1,1)='a'返回正常 → 第一位是 'a';返回异常 → 重试下一个字符。指数字段均可由此方法提取。自动化工具 sqlmap 在 2012 年被 Black Hat 首次展示时,仅需数百个请求即可从布尔响应中提取完整数据库结构。 -
基于时间的盲注(Time-Based Blind):页面没有任何可区分响应,攻击者利用数据库延时函数(MySQL
SLEEP()、PostgreSQLpg_sleep()、SQL ServerWAITFOR DELAY)构建条件延时:IF(condition, SLEEP(5), 0)。响应时间差异成为信息通道——5 秒延时 = 条件成立。这是最慢但最通用的注入方法,在无任何回显的最不利条件下仍有效。 -
联合查询注入(UNION-Based):当页面直接展示查询结果时,攻击者通过
UNION SELECT将自己的查询附加到原始查询结果集中,在同一个页面位置渲染出目标数据。这是效率最高、危害最大的注入形式。 -
二阶注入(Second-Order):恶意载荷不立即触发——攻击者先将含有 SQLi 片段的字符串存入数据库(如注册用户名为 ),当另一段代码在后续操作中读取该数据并拼入 SQL 查询时触发注入。因「进入数据库」与「进入 SQL 语句」之间存在时延和代码路径隔离,代码审计极易遗漏。