1. OWASP Top 10 的 A03(Injection)的 SQL/NoSQL/LDAP/XPath 注入原理
OWASP Top 10 中 A03(Injection)所涵盖的 SQL 注入、NoSQL 注入、LDAP 注入和 XPath 注入各自的原理是什么?为什么它们被归为同一类威胁?
- 注入攻击的共性:把不可信输入拼接进解释器/查询语法,导致语义被改写
- SQL、NoSQL、LDAP、XPath 各自注入的语法载体与触发点
- 注入的本质是"数据与代码(命令)未分离"
注入攻击的共性是"把用户可控的输入当作具有语义的代码/查询片段"拼接进解释器(数据库、LDAP、XPath 引擎、shell),从而改变原本的查询或命令语义。SQL 注入把输入拼进 SQL 语句,典型如 ' OR '1'='1 逃逸出字符串字面量,改写 WHERE 条件;NoSQL 注入针对 MongoDB 等,利用 $where、$regex、$ne、$gt 等操作符,把 {"user": {"$ne": null}} 这类对象当作查询条件传入,绕过身份校验;LDAP 注入通过 (&(uid=...) 构造特殊过滤表达式,利用 *、() 等元字符改变过滤逻辑;XPath 注入则把输入拼进 XPath 表达式,利用 //、or、| 等语法遍历或读取 XML 中不应暴露的节点。它们被归为 A03 一类,是因为根因相同:未对输入与语法做隔离,让数据流混入了可执行的语法。
理解注入要先抓住"解析边界"——任何拼了用户输入再交给解释器执行的语句都是注入面。防御的核心是参数化/预编译(把数据与语法分离),而不是靠过滤特殊字符(黑名单易被绕过)。这也解释了为什么规范化(parameterization)比转义更根本。
// 危险:拼接输入
String q = "SELECT * FROM users WHERE name='" + name + "'";
// 安全:参数化
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE name=?");
ps.setString(1, name);