Web防护自给自足:给Express写一个WAF中间件!
字数 1631 2025-08-18 11:39:12

Express WAF中间件开发指南

概述

本教程将详细介绍如何为Express框架开发一个Web应用防火墙(WAF)中间件,用于防护常见的Web攻击如SQL注入、XSS等。WAF(Web Application Firewall)是保护Web应用安全的重要组件,通过分析HTTP/HTTPS请求来识别和阻断恶意流量。

核心实现

基本结构

首先创建一个基本的Express应用,并添加WAF中间件:

var express = require('express');
var app = express();

// 根路由
app.get('/', function (req, res) {
  res.send('Hello ShareWAF.com');
});

// WAF中间件
app.use(function(req, res, next) {
  var path = req.url;
  if(waf_detect(path) == false){
    next();
  } else {
    // 检测到攻击,中断请求
    res.status(403).send('Forbidden');
  }
});

// 启动服务器
var server = app.listen(8000, function () {
  var host = server.address().address;
  var port = server.address().port;
});

攻击检测函数

waf_detect函数是WAF的核心,使用正则表达式检测恶意输入:

function waf_detect(str_to_detect) {
  // 规则来自ShareWAF(sharewaf.com)
  var regexp_rule = [
    // SQL注入检测规则
    /select.+(from|limit)/i,
    /(?:(union(.*?)select))/i,
    /sleep$(\s*)(\d*)(\s*)$/i,
    /group\s+by.+\(/i,
    /(?:from\W+information_schema\W)/i,
    /(current_)user|database|schema|connection_id)\s*\(/i,
    /\s*or\s+.*=.*/i,
    /order\s+by\s+.*--$/i,
    /benchmark/i,
    /base64_decode\(/i,
    /(current_)user|database|version|schema|connection_id)\s*\(/i,
    /into(\s+)+(?:dump|out)file\s*/i,
    
    // 文件系统攻击检测
    /(?:etc\/\W*passwd)/i,
    
    // Java框架漏洞检测
    /xwork.MethodAccessor/i,
    
    // 代码执行检测
    /(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(/i,
    
    // XSS检测
    /\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i,
    /(onmouseover|onmousemove|onerror|onload)\=/i,
    /javascript:/i,
    
    // 系统命令注入检测
    /(ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i,
    /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\|\|/i,
    
    // 危险协议检测
    /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\//i
  ];

  for(i=0; i< regexp_rule.length; i++) {
    if(regexp_rule[i].test(str_to_detect) == true) {
      console.log("攻击检测到,规则编号:", "("+i+")", regexp_rule[i]);
      return true;
    }
  }
  return false;
}

规则详解

SQL注入检测

  1. 基本SELECT语句检测

    • /select.+(from|limit)/i:检测包含"select"后跟任意字符和"from"或"limit"的模式
    • /(?:(union(.*?)select))/i:检测UNION SELECT联合查询注入
  2. 时间延迟攻击检测

    • /sleep$(\s*)(\d*)(\s*)$/i:检测SQL sleep函数调用
    • /benchmark/i:检测MySQL的benchmark函数
  3. 信息泄露检测

    • /(?:from\W+information_schema\W)/i:检测对information_schema的查询
    • /(current_)user|database|version|schema|connection_id)\s*\(/i:检测获取数据库信息的函数
  4. 逻辑绕过检测

    • /\s*or\s+.*=.*/i:检测OR条件注入
    • /order\s+by\s+.*--$/i:检测ORDER BY注入

文件系统攻击检测

  • /(?:etc\/\W*passwd)/i:检测对/etc/passwd文件的访问
  • /into(\s+)+(?:dump|out)file\s*/i:检测SQL文件导出攻击

XSS攻击检测

  1. HTML标签检测

    • /\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i:检测危险HTML标签
  2. 事件处理器检测

    • /(onmouseover|onmousemove|onerror|onload)\=/i:检测HTML事件属性
  3. JavaScript协议检测

    • /javascript:/i:检测JavaScript伪协议

系统命令注入检测

  • /(ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i:检测常见Linux命令
  • /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\|\|/i:检测命令链

危险协议检测

  • /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\//i:检测危险协议的使用

扩展建议

  1. 多维度检测

    • 当前示例仅检测URL路径,可扩展检测:
      • POST请求体
      • Cookie值
      • HTTP头(User-Agent, Referer等)
      • 文件上传内容
  2. 性能优化

    • 对正则表达式进行性能测试和优化
    • 考虑使用更高效的模式匹配算法
  3. 日志记录

    • 记录攻击尝试的详细信息
    • 实现IP黑名单功能
  4. 规则更新

    • 设计规则自动更新机制
    • 支持动态加载规则
  5. 误报处理

    • 实现白名单功能
    • 添加误报报告机制

测试方法

启动应用后,尝试以下攻击向量进行测试:

  1. SQL注入测试:

    http://127.0.0.1:8000/?id=select * from users
    
  2. XSS测试:

    http://127.0.0.1:8000/?q=<script>alert(1)</script>
    
  3. 命令注入测试:

    http://127.0.0.1:8000/?cmd=ls -la
    

总结

本教程展示了如何为Express框架实现一个基本的WAF中间件,通过正则表达式规则匹配来防护常见Web攻击。虽然示例简单,但包含了WAF的核心原理,开发者可以根据实际需求进行扩展和完善,构建更强大的Web应用防护系统。

Express WAF中间件开发指南 概述 本教程将详细介绍如何为Express框架开发一个Web应用防火墙(WAF)中间件,用于防护常见的Web攻击如SQL注入、XSS等。WAF(Web Application Firewall)是保护Web应用安全的重要组件,通过分析HTTP/HTTPS请求来识别和阻断恶意流量。 核心实现 基本结构 首先创建一个基本的Express应用,并添加WAF中间件: 攻击检测函数 waf_detect 函数是WAF的核心,使用正则表达式检测恶意输入: 规则详解 SQL注入检测 基本SELECT语句检测 : /select.+(from|limit)/i :检测包含"select"后跟任意字符和"from"或"limit"的模式 /(?:(union(.*?)select))/i :检测UNION SELECT联合查询注入 时间延迟攻击检测 : /sleep\((\s*)(\d*)(\s*)\)/i :检测SQL sleep函数调用 /benchmark/i :检测MySQL的benchmark函数 信息泄露检测 : /(?:from\W+information_schema\W)/i :检测对information_ schema的查询 /(current_)user|database|version|schema|connection_id)\s*\(/i :检测获取数据库信息的函数 逻辑绕过检测 : /\s*or\s+.*=.*/i :检测OR条件注入 /order\s+by\s+.*--$/i :检测ORDER BY注入 文件系统攻击检测 /(?:etc\/\W*passwd)/i :检测对/etc/passwd文件的访问 /into(\s+)+(?:dump|out)file\s*/i :检测SQL文件导出攻击 XSS攻击检测 HTML标签检测 : /\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i :检测危险HTML标签 事件处理器检测 : /(onmouseover|onmousemove|onerror|onload)\=/i :检测HTML事件属性 JavaScript协议检测 : /javascript:/i :检测JavaScript伪协议 系统命令注入检测 /(ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i :检测常见Linux命令 /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\|\|/i :检测命令链 危险协议检测 /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\//i :检测危险协议的使用 扩展建议 多维度检测 : 当前示例仅检测URL路径,可扩展检测: POST请求体 Cookie值 HTTP头(User-Agent, Referer等) 文件上传内容 性能优化 : 对正则表达式进行性能测试和优化 考虑使用更高效的模式匹配算法 日志记录 : 记录攻击尝试的详细信息 实现IP黑名单功能 规则更新 : 设计规则自动更新机制 支持动态加载规则 误报处理 : 实现白名单功能 添加误报报告机制 测试方法 启动应用后,尝试以下攻击向量进行测试: SQL注入测试: XSS测试: 命令注入测试: 总结 本教程展示了如何为Express框架实现一个基本的WAF中间件,通过正则表达式规则匹配来防护常见Web攻击。虽然示例简单,但包含了WAF的核心原理,开发者可以根据实际需求进行扩展和完善,构建更强大的Web应用防护系统。