-
SQL 关键字过滤规则优化
- 原理:SQL 注入攻击常常会使用 SQL 关键字(如 SELECT、INSERT、UPDATE、DELETE、DROP 等)来篡改数据库查询。传统的规则可能只是简单地禁止这些关键字出现在用户输入中,但这可能会导致误报,因为有些合法的业务场景也可能需要使用这些关键字。
- 优化策略:
- 上下文感知过滤:WAF 规则应该考虑关键字出现的上下文。例如,在一个允许用户搜索数据库内容的功能中,“SELECT” 关键字可能是合法的。可以配置 WAF 来检查关键字是否出现在一个完整的、符合语法的 SQL 查询结构中。如果 “SELECT” 关键字出现在一个单独的输入字段,且没有其他合理的 SQL 语法结构相伴(如没有 “FROM” 子句等),则视为可疑。
- 参数化查询验证:鼓励并强制后端应用使用参数化查询。WAF 可以检查后端代码是否正确地实现了参数化查询。例如,在 Java 中,检查是否使用
PreparedStatement
来构建 SQL 查询,并且用户输入是通过setString()
或其他参数设置方法来传递的,而不是直接拼接在 SQL 语句中。如果发现没有正确使用参数化查询,WAF 可以发出警告或阻止请求。 - 动态黑名单和白名单机制:根据业务需求建立动态的关键字黑名单和白名单。例如,对于一个特定的数据库更新功能,允许 “UPDATE” 关键字在特定的输入字段(如用于更新用户信息的表单)中出现,但禁止 “DROP TABLE” 等危险关键字。同时,根据应用的更新和变化,动态调整这个名单。如果新添加了一个功能需要使用某个原本被禁止的关键字,管理员可以将其添加到白名单中,同时确保相应的安全措施已经到位。
-
特殊字符检测规则优化
- 原理:攻击者经常会使用特殊字符(如单引号、双引号、分号、反斜杠等)来构造 SQL 注入攻击。然而,这些字符在合法的输入中也可能会出现,如在用户输入包含撇号的名字或密码中。
- 优化策略:
- 基于数据类型的特殊字符处理:根据输入字段的数据类型来确定特殊字符的允许程度。例如,对于一个只接受数字的输入字段(如用户年龄),任何非数字的特殊字符都应该被禁止。而对于一个文本类型的输入字段(如用户名),可以允许有限制地使用特殊字符。WAF 可以检查特殊字符的使用是否符合该字段的预期数据类型。
- 转义字符检查:检查特殊字符是否被正确地转义。在许多编程语言和数据库操作中,特殊字符需要进行转义以避免被错误地解析为 SQL 语法的一部分。例如,在 PHP 中,使用
mysqli_real_escape_string()
函数来转义输入中的特殊字符。WAF 可以检查后端代码是否正确地执行了转义操作。如果发现特殊字符没有被转义或者转义不正确,将其视为可疑输入。 - 组合攻击检测:关注特殊字符与 SQL 关键字的组合。例如,单引号后面紧接着 “OR” 或 “AND” 等逻辑关键字可能是 SQL 注入攻击的迹象。WAF 可以配置规则来检测这种组合,并且根据组合的具体情况和出现的位置来判断是否为攻击。对于高风险的组合(如在密码输入字段中出现 “’; DROP TABLE users;–”),应该立即采取拦截措施。
-
数字型 SQL 注入检测规则优化
- 原理:数字型 SQL 注入是指攻击者利用数字输入字段(如产品 ID、用户 ID 等)来篡改 SQL 查询。这种攻击可能不涉及明显的 SQL 关键字和特殊字符,而是通过修改数字参数的值来达到攻击目的。
- 优化策略:
- 数值范围验证:为每个数字输入字段确定合理的数值范围。例如,对于一个产品 ID,其范围可能是从 1 到 1000(假设网站只有 1000 种产品)。WAF 可以检查输入的数字是否在这个合理范围内。如果超出范围,视为可疑输入。同时,考虑边界值的情况,有些攻击者可能会尝试使用边界值来触发漏洞,如输入最大值加 1 或者最小值减 1。
- 数据类型一致性检查:确保数字输入在数据库查询中被正确地作为数字类型处理。有些攻击可能会尝试改变数字的类型,例如,将一个整数类型的输入通过某种方式转换为字符串类型,从而绕过基于数字类型的安全检查。WAF 可以检查后端代码是否正确地验证了输入数据的类型,以及在 SQL 查询中是否正确地使用了数字类型的参数。
- 关联查询检查:对于与数字输入相关的关联查询(如通过产品 ID 查询产品信息以及相关的评论信息),检查查询之间的逻辑是否合理。攻击者可能会尝试通过修改数字输入来影响关联查询的结果,从而获取未授权的信息。WAF 可以分析关联查询的结构和逻辑,确保数字输入不会被用于非法的关联操作,如通过篡改产品 ID 来获取其他产品的评论信息。
-
语义分析规则优化
- 原理:除了语法层面的检查,对 SQL 注入攻击的检测还可以深入到语义层面。通过分析 SQL 查询的语义,可以更准确地判断输入是否具有恶意意图。
- 优化策略:
- 意图分析:尝试理解 SQL 查询的意图。例如,使用自然语言处理(NLP)技术或基于规则的语义分析来判断一个查询是用于正常的数据检索、更新还是可能用于破坏数据库。如果一个查询的语义看起来像是在尝试获取系统表的信息(如查询数据库的用户表结构),而这个功能在正常业务中并不存在,那么可能是一个攻击迹象。
- 逻辑完整性检查:检查 SQL 查询的逻辑完整性。一个正常的 SQL 查询应该有合理的逻辑结构,如在查询条件中使用合理的比较运算符(如等于、大于、小于)。如果检测到查询中包含不合逻辑的比较运算符(如总是返回真的 “1 = 1” 条件)或者不合理的逻辑连接词(如在一个简单的查询中使用大量的 “OR” 连接),可能是 SQL 注入攻击。
- 业务逻辑验证:将 SQL 查询与业务逻辑相结合进行验证。例如,对于一个购物网站,一个正常的订单查询应该是基于用户 ID 和订单时间范围等合理的参数。WAF 可以根据业务逻辑来检查 SQL 查询是否符合正常的业务操作。如果一个查询试图获取所有用户的订单信息而没有任何合理的授权验证,可能是一个攻击尝试。