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防御, 上游代理, 内存存储, 动态封禁, 反向代理, 安全编程, 应用层防御, 日志审计, 流量过滤, 状态检测, 签名分析, 网络安全, 路径遍历防御, 轻量级, 隐私保护