WAF是如何通过规则拦截SQL注入攻击的?

来源:JS教程作者:猫儿头衔:草根站长
导读:本期聚焦于猫儿创作的《WAF是如何通过规则拦截SQL注入攻击的?》,敬请观看详情。不少业务系统上线后频繁遭到恶意拼凑的SQL语句探测,核心原因往往是WAF规则覆盖不全。WAF拦截SQL注入主要依赖正则匹配、词法特征识别和语义分析三类手段。正则规则可快速命中union select、sleep()等典型恶意片段,但面对变形绕过容易失效。词法层将请求参数拆成令牌,比对危险函数与注释符出现频率。语义分析则还原SQL逻辑,判断是否存在权限越权查询。实际部署中,应组合使用多种规则并定期更新特征库,同时开启误报日志复查,才能在挡住攻击的同时不误伤正常搜索接口。

SQL注入攻击长期位居Web安全威胁榜前列,攻击者通过在参数中拼接恶意SQL片段,试图绕过身份认证或直接拖库。WAF(Web应用防火墙)作为边界防护的重要手段,依靠一套持续演进的拦截规则识别并阻断这类请求。理解这些规则的实现方式,有助于我们在业务侧写出更安全的代码,也能在WAF误报时快速定位原因。

WAF是如何通过规则拦截SQL注入攻击的?

基于正则匹配的静态规则机制

最常见的WAF拦截手段是正则表达式匹配。安全厂商会维护一份特征库,把已知攻击语句抽象成模式。例如unions+selectors+1s*=s*1sleeps*(s*d+s*)等都会被写成正则,在请求到达后端前做全文扫描。这种规则响应极快,对自动化工具产生的标准攻击payload命中率很高。

不过正则规则有明显的短板。攻击者可以使用大小写混写、内联注释、换行拆分等方式变形。比如UNION/**/SELECT就能绕过只认空格的写法;用0x73656c656374十六进制代替明文字符串也能逃过简单匹配。因此现代WAF很少单靠正则,而是把它作为第一道粗筛,命中后交给后续模块细看。

在自研WAF时,正则要注意避免灾难性回溯。下面这段PHP示例展示了一个简单但安全的匹配思路,先转义再判断危险词,而不是写复杂嵌套分组:

<?php
function waf_check($input) {
    // 移除注释干扰
    $clean = preg_replace('//*.*?*//s', '', $input);
    $clean = preg_replace('/--.*$/m', '', $clean);
    // 基础正则特征
    $rules = array(
        '/unions+select/i',
        '/borbs+d+s*=s*d+/i',
        '/sleeps*(s*d+s*)/i'
    );
    foreach ($rules as $r) {
        if (preg_match($r, $clean)) {
            return false;
        }
    }
    return true;
}
?>

词法分析与请求参数结构化检测

比正则更进一步的是词法分析。WAF把每个参数值当作一段待编译的SQL片段,用轻量词法器拆分成令牌(token),统计关键字、运算符和注释符的分布。正常搜索词里很少同时出现selectfrom,而如果参数中出现括号嵌套调用version()且伴随concat,风险评分就会拉高。

这种方法的优势是能识别变形。例如攻击者用sele/**/ct,正则可能漏掉,但词法器先去注释再切词,依然能得到select令牌。部分开源WAF如ModSecurity的CRS规则集就大量采用变量计数,比如ARG_NAME匹配特殊字符数量,超过阈值就拦截。

下面是用Python模拟令牌统计的简化逻辑,真实产品会结合上下文判断参数是否进入SQL语句拼接点:

import re

def token_risk(value):
    # 去内联注释
    v = re.sub(r'/*.*?*/', '', value)
    tokens = re.findall(r'[a-zA-Z_]+|[d]+|[^a-zA-Z0-9_]', v)
    danger_kw = {'select','union','insert','drop','update','delete'}
    score = 0
    for t in tokens:
        if t.lower() in danger_kw:
            score += 2
        if t in ('(',')','--','#','/*'):
            score += 1
    return score

print(token_risk('id=1 union select name from user--'))

语义还原与动态行为规则

最高级的拦截来自语义分析。WAF借助SQL解析器,把参数回填到预设的SQL模板,看最终语句是否改变了原查询语义。比如后端代码是select * from t where id=$_GET['id'],正常传1得到单行查询;若传入1 or 1=1,解析树会多出恒真条件,WAF据此阻断而非只看字符。

语义规则能防住绝大多数绕过,但计算开销大,通常只针对高风险接口开启。另外,WAF还会结合行为规则:同一IP短时间大量试探不同payload,即使单次未命中也触发临时封禁。下表对比了三类规则的特点:

规则类型检测速度绕过难度误报可能
正则匹配极快
词法分析较快较低
语义还原

实际运维中,建议开启正则加词法双引擎,核心接口叠加语义模块。同时把WAF日志接入SIEM,定期抽查拦截项,防止正常报表查询被误杀。开发侧仍须使用预处理语句,WAF只是纵深防御的一环,不能替代代码层参数绑定。

SQL_injectionWAF拦截规则修改时间:2026-08-18 18:02:43

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。