SQL 注入
SQL 注入 是什么?
SQL 注入一种代码注入攻击,将攻击者控制的 SQL 语句植入数据库查询,以读取、篡改或破坏数据。
SQL 注入(SQLi)利用了将不可信输入拼接到 SQL 语句、而非使用参数化查询的应用程序。通过注入引号、注释或 UNION 子句,攻击者可改写预期查询,从而导出数据表、绕过认证、提升权限或运行数据库命令。其变种包括经典的内联(in-band)注入、基于错误的注入、布尔/时间型盲注(从响应或响应延迟中逐位推断数据),以及二阶注入——存储的输入在后续被复用时触发。
SQLi 已有数十年历史,但至今仍具毁灭性。CVE-2023-34362 是 Progress MOVEit Transfer 中的一个 SQL 注入零日漏洞,自 2023 年 5 月下旬起被 Cl0p 勒索软件团伙利用:未经认证的攻击者注入 SQL 以部署 LEMURLOOT Web Shell 并窃取数据库内容,波及数千家下游组织。2015 年的 TalkTalk 数据泄露事件暴露了约 157,000 条客户记录,同样是针对一个遗留网页的 SQL 注入。SQLi 归属于 OWASP Top 10 A03:2021(注入)。
首要的防御手段是参数化查询/预编译语句,它将代码与数据分离,使输入永远无法改变查询结构。再辅以安全使用的 ORM 框架、白名单式输入验证、最小权限的数据库账户(应用登录账户不具备 DBA 权限)、存储过程的规范使用,以及作为纵深防御的 WAF。仅靠手动转义既脆弱又不被推荐。
flowchart TD
U["不可信输入"] --> C{"查询如何构建?"}
C -->|"字符串拼接"| I["' OR 1=1 -- 被注入到 SQL 中"]
I --> DB[("数据库执行攻击者的 SQL")]
DB --> X["数据转储 / 绕过认证"]
C -->|"参数化查询"| S["输入作为数据而非代码绑定"]
S --> OK["查询结构得以保留 — 安全"]● 示例
- 01
在登录表单中输入 ' OR '1'='1 返回第一条用户记录并绕过认证。
- 02
报表接口的某个参数被精心构造,触发 UNION SELECT 以窃取密码哈希。
● 常见问题
SQL 注入 是什么?
一种代码注入攻击,将攻击者控制的 SQL 语句植入数据库查询,以读取、篡改或破坏数据。 它属于网络安全的 攻击与威胁 分类。
SQL 注入 是什么意思?
一种代码注入攻击,将攻击者控制的 SQL 语句植入数据库查询,以读取、篡改或破坏数据。
如何防御 SQL 注入?
针对 SQL 注入 的防御通常结合技术控制与运营实践,详见上方完整定义。
SQL 注入 还有哪些其他名称?
常见的别称包括: SQLi。