SomebodyForSomeone/WAF-lya

GitHub: SomebodyForSomeone/WAF-lya

一个用 Go 编写的轻量级有状态 WAF,以反向代理模式运行,通过行为分析和签名检测防御 L7 DDoS、BOLA 枚举及常见 Web 攻击。

Stars: 0 | Forks: 0

# WAF-lya **WAF-lya** 是一个轻量级的 Web Application Firewall (WAF),使用 Go 编写。它运行在 **Reverse Proxy** 模式下,在将传入的 HTTP 流量转发到目标服务器之前进行过滤。 其主要特点是 **Stateful-分析**,它跟踪用户会话的上下文以检测行为异常(例如资源 ID 枚举或扫描),而不仅仅是基于静态规则进行拦截。 ## 功能特性 - **Rate Limiting (Token Bucket):** 支持突发流量的请求频率限制。 - **Stateful Context Analysis (防御 BOLA):** 跟踪用户在单位时间内访问的唯一资源数量。有效防止 ID 枚举 (IDOR/BOLA) 和扫描攻击。 - **Signature Analysis:** 在对请求进行预处理(移除注释、解码、大小写转换)后,过滤经典的攻击向量(SQL Injection, XSS, Path Traversal)。 - **Dynamic Throttling:** 对于重复违规行为,封锁(Ban)时间会按指数级增加(系数可配置)。 - **In-Memory Storage:** 通过将状态存储在内存中来实现高速处理。 ## 安装与运行 ### 环境要求 - Go 1.25+ ### 运行步骤 1. **克隆仓库:** git clone https://github.com/SomebyForSomeone/WAF-lya/tree/main cd WAF-lya 2. **安装依赖:** go mod tidy 3. **启动 WAF:** ``` go run ./cmd ``` 默认情况下,WAF 在 `:8000` 端口启动,并将请求代理到 `http://localhost:8081`。 **更改端口和地址:** - 通过 `waf_config.json` - 通过命令行参数:`go run ./cmd waf_config_alt.json` - 通过环境变量:`WAF_CONFIG=waf_config_alt.json go run ./cmd` ## 配置说明 防护参数在文件 ```waf_config.json``` 中进行设置。修改配置需要重启应用程序。 配置示例: ``` { "waf_port": ":8000", // Порт WAF (опционально, по умолчанию :8000) "server_address": "http://localhost:8081", // Адрес целевого сервера (опционально) "middleware_chain": [ // Настройка порядка Middleware в цепочке программы "context", "rate_limit", "signature" ], "rate_limit": { "limit": 5, // Запросов в секунду (RPS) "burst": 20, // Максимальный всплеск запросов "ban_seconds": 30, // Длительность первого бана "multiplier": 2.0, // Множитель времени бана при повторном нарушении "violation_reset_hours": 24 // Таймаут сброса множителя блокировки }, "context": { "window_seconds": 60, // Окно анализа поведения "threshold": 20, // Лимит уникальных ресурсов (ID) за окно "ban_seconds": 300, // Время бана за подозрение на BOLA "multiplier": 2.0, "resource_extractor": { "type": "path_segment", // Способ извлечения ресурса: query_param, path_segment, last_segment, last_numeric_segment "name": "users" // Имя query-параметра или сегмента пути, после которого расположен ID } }, "signature": { "log_matches": true // Логирование совпадений сигнатур в консоль } } ``` ## 工作原理 WAF 在请求到达后端之前构建一条防护模块链: 1. **Context Middleware:** 检查会话是否存在异常(例如访问 `/api/user/1`,然后访问 `/api/user/2`...)。根据配置中的规则提取资源标识符。如果唯一资源数量超过阈值,IP 将在配置设定的时间内被封锁。对于重复封锁,时间会动态增加。 2. **Rate Limit Middleware:** 检查“桶”中的令牌。如果令牌耗尽,IP 将被暂时封锁 (429 Too Many Requests)。与 Context Middleware 一样,也采用动态封锁时间的机制。 3. **Signature Middleware:** 对 URL 和请求体进行归一化处理,并根据正则表达式进行检查 (SQLi, XSS, Path Traversal)。如果匹配,则返回 403 Forbidden。 4. **Reverse Proxy:** 如果所有检查都通过,请求将被转发到目标服务。 ### 资源标识符提取 可以为 `context` 模块通过 `resource_extractor` 字段设置一种资源标识符提取方式。 - `query_param` — 获取名为 `name` 的 query 参数值,例如 `id` - `path_segment` — 在路径中查找名为 `name` 的段,并获取其后的段 - `last_segment` — 获取路径的最后一个段 - `last_numeric_segment` — 获取路径中最后一个数字段 针对路由 `/api/users/42/profile` 的示例: ``` { "context": { "resource_extractor": { "type": "path_segment", "name": "users" } } } ``` 在这种情况下,`context` 模块会将 `42` 视为资源标识符。 如果未设置 `resource_extractor`,则使用默认逻辑: - 首先检查 query 参数 `id` - 然后检查路径中最后一个数字段
标签:API安全, AppImage, BOLA防护, CISA项目, DDoS防护, DevSecOps, EVTX分析, Go, Golang, IDOR防护, JSON输出, LangChain, Ruby工具, SQL注入防御, WAF, Web应用防火墙, XSS防御, 上游代理, 内存存储, 动态封禁, 反向代理, 安全编程, 应用层防御, 日志审计, 流量过滤, 状态检测, 签名分析, 网络安全, 路径遍历防御, 轻量级, 隐私保护