AhmetPayaslioglu/web-log-anomaly-detector
GitHub: AhmetPayaslioglu/web-log-anomaly-detector
一款轻量级的 Web 访问日志异常检测工具,通过正则规则与滑动窗口分析自动识别 OWASP Top 10 攻击、webshell、CVE 利用及暴力破解行为。
Stars: 1 | Forks: 1
# 日志异常检测器 (LAD)
[](https://www.python.org/)
[](LICENSE)
[]()
## 为什么需要?
Web 访问日志几乎记录了触及你服务器的每一次攻击 ——
问题在于没有人去阅读它们。`grep` 适用于查找单一模式;但当你需要知道昨天是五十种不同攻击类别中的*哪一种*击中了你,在哪一行,来自哪个 IP,以及服务器是否放行了它时,`grep` 就无能为力了。
**LAD** 只需解析一次日志,即可生成一份彩色的报告,回答以下问题:
- **什么**被发送到了服务器(涵盖 16 种攻击类别的 90 多条 regex 规则)
- **在哪里**(日志中的行号 + 哪个 HTTP 字段 —— path / query / UA / referer)
- **谁**发送了它(源 IP、扫描器 User-Agent 指纹)
- **攻击成功了吗?**(HTTP 状态码 —— 绿色 = 2xx 成功,红色 = 4xx/5xx 被拦截)
## 功能
- 开箱即用的**三种日志格式**:nginx combined、Apache combined、
IIS W3C(动态 `#Fields:` header —— 适用于任何列布局)
- 根据文件头或文件名**自动检测格式**
- **90 多条模式规则**,涵盖 OWASP Top 10、webshell 和 CVE 漏洞利用路径
- 针对 Web 身份验证暴力破解、流量尖峰和
目录爆破的**有状态检测器**(滑动窗口逻辑,而不仅仅是 regex)
- **丰富的终端输出** —— 彩色严重程度、行号、高亮匹配项、
状态码着色(成功与失败)
- **JSON 输出**,可通过管道传入 SIEM / 仪表盘 / 脚本
- **Tail 模式**(`--follow`),用于实时监控活动日志
- **自定义规则** —— 每个 regex 和阈值都位于一个单独的 YAML 文件中
- **没有沉重的依赖** —— `click`、`rich`、`pyyaml`。仅此而已。
## OWASP Top 10 (2021) 覆盖范围
| OWASP | 检测到的类别 |
|----------------------------------------|----------------------------------------------|
| A01 Broken Access Control | `traversal`, `forced_browse`, `ssrf` |
| A02 Cryptographic Failures | *(无法从访问日志中检测)* |
| A03 Injection | `sqli`, `nosqli`, `xss`, `cmdi`, `ssti`, `xxe` |
| A04 Insecure Design | *(设计层面,无法检测)* |
| A05 Security Misconfiguration | `sensitive_files`(`.env`、`.git`、`actuator`、`web.config`、备份文件、数据库转储) |
| A06 Vulnerable & Outdated Components | `log4shell`, `spring4shell`, `shellshock`, `cve_paths`(Struts2、ProxyShell、GitLab CVE-2021-22205、PHPUnit、Confluence、ThinkPHP、Solr、F5 BIG-IP、Citrix、vCenter 等) |
| A07 Identification & Auth Failures | `auth_brute`(滑动窗口 401/403/419/429)、`scanner` |
| A08 Software & Data Integrity Failures | `deserialization`(Java `rO0AB`、.NET ViewState、PHP `O:n:`、Python pickle) |
| A09 Security Logging Failures | *(检测器本身有助于解决此问题)* |
| A10 Server-Side Request Forgery | `ssrf`(AWS/GCP/Azure 元数据、RFC1918、`file://`、`gopher://`) |
**超越 OWASP:**
| 类别 | 捕获内容 |
|-------------|--------------------------------------------------------------------|
| `webshell` | c99 / r57 / wso / b374k / alfa / China Chopper / antSword / 双扩展名上传 / `.php` 上的 `cmd=` 参数 |
| `scanner` | sqlmap、nikto、nmap、gobuster、feroxbuster、ffuf、nuclei、Burp、ZAP、Acunetix、Nessus 等(User-Agent + 目录爆破启发式检测) |
| `traffic` | 每个 IP 的滑动窗口每秒请求数 (RPS) 尖峰 |
## 快速开始
```
git clone https://github.com//web-log-anomaly-detector
cd web-log-anomaly-detector
python -m pip install -e .
```
扫描其中一个内置的合成日志,立即查看输出:
```
python -m log_anomaly_detector.cli scan examples/owasp_sample.log
```
这会在一个 46 行的文件上生成**涵盖 41 条不同规则的 52 个发现结果** ——
涵盖每一个 OWASP 类别,以及 webshell、CVE 和暴力破解突发流量。
### 用法
```
# 自动检测格式
lad scan /var/log/nginx/access.log
# 强制指定格式
lad scan u_ex260616.log --format iis
# 为下游工具编写 JSON
lad scan access.log --json-out findings.json
# 使用你自己的规则
lad scan access.log --rules my_rules.yaml
# Tail 模式 — 持续读取新行(按 Ctrl+C 停止)
lad scan /var/log/nginx/access.log --follow
```
### 示例输出
```
L# SEV ST CATEGORY RULE FIELD MATCH
---------------------------------------------------------------------------------
2 HIGH 200+ sqli union_select query UNION SELECT
6 CRITICAL 500- cmdi shell_chain query ;cat
12 CRITICAL 200+ ssrf aws_metadata query 169.254.169.254
17 CRITICAL 200+ log4shell jndi_lookup query ${jndi:ldap:
20 CRITICAL 500- shellshock bash_function_def user_agent () { :; };
27 CRITICAL 200+ webshell common_webshell_name path /c99.php
31 CRITICAL 500- cve_paths struts2_ognl query #_memberAccess
42 HIGH 401- auth_brute web_auth_brute path 8x 401 on /wp-login.php
Status legend: '+' = 2xx success '-' = 4xx/5xx failure '~' = other
```
**绿色**状态意味着服务器*成功响应* —— 如果它与 CRITICAL(严重)发现结果配对,那这就是你需要优先调查的行。
## 自定义规则
每个 regex、阈值和严重程度都位于一个单独的文件中:
[`src/log_anomaly_detector/rules/default.yaml`](src/log_anomaly_detector/rules/default.yaml)。
```
injection:
sqli:
- name: union_select
severity: HIGH
pattern: "\\bunion\\b.{0,40}\\bselect\\b"
webshell:
- name: common_webshell_name
severity: CRITICAL
pattern: "/(c99|r57|wso|b374k|alfa|...)\\.(php|asp|aspx|jsp)"
auth_brute:
login_path_pattern: "(login|signin|wp-login|api/auth|...)"
window_seconds: 60
min_failures: 8
failure_statuses: [401, 403, 419, 429]
severity: HIGH
```
复制该文件,进行调整,然后通过 `--rules my_rules.yaml` 传入。
## 项目布局
```
src/log_anomaly_detector/
parsers/ nginx / apache / IIS (W3C dynamic #Fields:) line parsers
detectors/ injection (regex pack), scanner (UA + dir-bust),
traffic (RPS), auth_brute (sliding 401/403)
reporters/ rich terminal table + JSON
rules/ default.yaml — all patterns and thresholds
cli.py click entry point: `lad scan ...`
tests/ pytest suite (40 tests, OWASP coverage)
examples/ synthetic logs covering every category
```
## 工作原理
1. **解析** —— 每一行都被转换为 `LogEntry`(时间戳、IP、method、
path、query、状态码、UA、referer)。IIS 解析会读取 `#Fields:`
指令,因此适用于任何列顺序。
2. **扫描** —— 每个 `LogEntry` 被输入到四个检测器系列:
- `InjectionDetector` —— 对六个
候选字段(path、query、URL 编码的 URL、解码后的 URL、UA、referer)运行 `rules.yaml` 中的每一条 regex,
因此跨越 path+query 或隐藏在 header 中的攻击仍然可以匹配。
- `ScannerDetector` —— User-Agent 匹配 + 每个目录爆破的 IP(
不同 path 数量 × 4xx 比例)。
- `TrafficDetector` —— 每个源 IP 的滑动窗口 RPS 尖峰。
- `AuthBruteDetector` —— 类似登录 endpoint 上的滑动窗口身份验证失败。
3. **报告** —— 发现结果按行号排序,根据严重程度和
HTTP 状态着色,并作为 `rich` 表格打印;可选择序列化为 JSON。
每个发现结果都记录了 `line_no`、匹配的子字符串、发现它的字段,
以及服务器返回的 HTTP 状态,以便你立即判断
攻击是被拦截了还是通过了。
## 路线图
- [ ] 用于 `--follow` 模式的 Discord / Slack / Telegram webhook
- [ ] GeoIP 丰富信息(MaxMind GeoLite2)
- [ ] 按 IP 分组报告(`--group-by ip`)
- [ ] 用于 RPS / endpoint 异常的 ML 基线(Isolation Forest)
- [ ] 用于自定义检测器的插件架构
- [ ] HTML 报告
## 测试
```
pip install pytest
python -m pytest -q
```
40 个测试覆盖了解析器、每个 OWASP 类别、webshell 模式、CVE
指纹以及身份验证暴力破解检测器。
## 许可证
[MIT](LICENSE) ——
可免费使用、修改和分发。如果 LAD 帮助你在生产环境中捕获了
恶意攻击,欢迎在 GitHub 上点个 star ⭐。
标签:AMSI绕过, CISA项目, Python, Web安全, 威胁检测, 恶意代码分类, 无后门, 蓝队分析, 逆向工具