WAF 如何精准识别 SQL 注入攻击的复杂变种

 

  • 基于规则匹配的识别方法
    • 原理
      • WAF 可以预设一系列已知的 SQL 注入攻击规则。例如,对于常见的 SQL 注入语句,像 “’ or 1=1–” 这样的字符串,会被作为规则存储在 WAF 的规则库中。当请求中的数据包含与这些规则匹配的内容时,WAF 就会判定为可能的 SQL 注入攻击。对于复杂变种,规则可以包括多种 SQL 语法元素的组合。比如,检测是否存在 SQL 关键字(如 SELECT、INSERT、UPDATE 等)与特殊字符(如单引号、双引号、分号等)的可疑组合。
    • 示例
      • 假设一个复杂变种的 SQL 注入攻击语句是 “1′ UNION ALL SELECT password FROM users WHERE ‘a’=’a”。WAF 会先将请求内容进行拆分,检查其中是否包含 “UNION ALL”(SQL 关键字组合)、单引号等可能用于 SQL 注入的元素,并且这些元素的组合方式是否符合 SQL 注入的模式。如果符合规则中定义的可疑模式,WAF 就会触发警报。
  • 语义分析技术
    • 原理
      • WAF 会对请求中的 SQL 语句部分进行语义理解。它会分析 SQL 语句的语法结构和语义逻辑。对于复杂变种,通过构建语法树来解析 SQL 语句的结构。例如,判断是否存在子查询、嵌套查询或者多表联合查询等复杂的 SQL 操作,并且检查这些操作中是否有非法的数据输入点。同时,还会考虑 SQL 语句的上下文,比如在一个登录验证的 SQL 查询中,检查用户输入的参数是否被用于构建不合理的查询条件。
    • 示例
      • 考虑一个复杂的 SQL 注入变种,如 “’ AND (SELECT CASE WHEN (SUBSTRING (password,1,1)=’a’ FROM users) THEN 1 ELSE ‘a’ END)=’a”。WAF 会分析这个 SQL 语句的语义,识别出 “SUBSTRING” 函数(用于提取字符串部分)和 “CASE WHEN” 语句(条件判断)等复杂结构。通过分析这个语句是否在合法的业务逻辑范围内使用这些函数和语句,来判断是否为 SQL 注入攻击。如果发现这个语句在正常的登录验证等业务场景中不应该出现这样复杂的条件判断和字符串提取操作,就会判定为可能的攻击。
  • 机器学习辅助识别
    • 原理
      • WAF 可以利用机器学习算法,如监督学习中的分类算法。首先,使用大量已知的正常 SQL 请求和 SQL 注入攻击样本(包括复杂变种)来训练模型。模型可以学习到 SQL 注入攻击的特征,如特定的字符序列模式、SQL 语法结构的异常等。当新的请求到来时,模型会根据训练得到的知识来预测该请求是否为 SQL 注入攻击。一些机器学习模型还可以处理高维数据,能够综合考虑多个因素,如请求的来源 IP、请求时间、请求中的参数数量等,来更准确地判断是否为攻击。
    • 示例
      • 假设已经训练好一个机器学习模型,当一个包含复杂 SQL 注入变种的请求到来时,模型会提取请求中的相关特征,如 SQL 语句部分的长度、包含的特殊字符种类和数量、与正常请求相比语法结构的偏离程度等。这些特征会被输入到模型中,模型根据之前学习到的知识,计算出这个请求是 SQL 注入攻击的概率。如果概率超过一定阈值,WAF 就会采取相应的防御措施。
  • 参数化查询验证
    • 原理
      • 许多安全的编程实践提倡使用参数化查询来防止 SQL 注入。WAF 可以检查应用程序是否正确地使用了参数化查询。对于复杂变种的 SQL 注入攻击,即使攻击者试图通过构造复杂的 SQL 语句来绕过防护,WAF 可以验证查询中的参数是否是按照参数化的方式正确传递。如果发现查询中的参数部分包含了非法的 SQL 语法结构,而不是单纯的参数值,就可以判定为可能的 SQL 注入攻击。
    • 示例
      • 在一个使用 Java JDBC 的应用程序中,正确的参数化查询应该是类似于 “PreparedStatement pstmt = conn.prepareStatement (“SELECT * FROM users WHERE username =? AND password =?”); pstmt.setString (1, username); pstmt.setString (2, password);”。WAF 会检查是否是这样规范的参数化查询方式。如果发现查询语句是 “SELECT * FROM users WHERE username = ‘”+username+”‘ AND password = ‘”+password+”‘”(这种拼接方式容易导致 SQL 注入),并且其中包含了可能用于 SQL 注入的复杂变种内容,如 “’ UNION ALL SELECT password FROM users WHERE ‘a’=’a” 作为用户名或密码的一部分输入,WAF 就会识别出这是一个潜在的 SQL 注入攻击。