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注入检测
-
基本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等)
- 文件上传内容
- 当前示例仅检测URL路径,可扩展检测:
-
性能优化:
- 对正则表达式进行性能测试和优化
- 考虑使用更高效的模式匹配算法
-
日志记录:
- 记录攻击尝试的详细信息
- 实现IP黑名单功能
-
规则更新:
- 设计规则自动更新机制
- 支持动态加载规则
-
误报处理:
- 实现白名单功能
- 添加误报报告机制
测试方法
启动应用后,尝试以下攻击向量进行测试:
-
SQL注入测试:
http://127.0.0.1:8000/?id=select * from users -
XSS测试:
http://127.0.0.1:8000/?q=<script>alert(1)</script> -
命令注入测试:
http://127.0.0.1:8000/?cmd=ls -la
总结
本教程展示了如何为Express框架实现一个基本的WAF中间件,通过正则表达式规则匹配来防护常见Web攻击。虽然示例简单,但包含了WAF的核心原理,开发者可以根据实际需求进行扩展和完善,构建更强大的Web应用防护系统。