一个用于 PHP 应用的轻量级注入式 WAF(检测 + 可选拦截 + 审计面板),以低侵入方式采集请求与响应并进行多层检测与审计。
- PHP 8.0+
- Web 服务器(Apache/Nginx + PHP-FPM)
- 进程权限能读取需要监控的应用目录
Note
如果目标环境需要兼容 PHP 7,请切换到 php7 分支
- 将仓库放到应用可访问路径,如
/var/www/html/waf。 - 配置:编辑
config.php(主要项见下节)。 - 启动监控脚本:
./start.sh start脚本参数:start|stop|restart|status|clear。
- 访问监控面板(非必须):
http://<host>/waf/index.php
config.php:全局配置(功能开关、阈值、路径)monitor.php:运行时捕获与主流程(请求/响应采集、拦截、日志)detector.php:检测引擎(规则、评分、解码展开)index.php:审计面板(列表、详情、开关)start.sh:管理脚本(启动/停止/重启)
-
function(array):功能开关集合,键值为布尔值,常见子项:block_detected_attack(bool, default: true):当检测器明确判定为攻击时阻断请求(request stage)。生产环境推荐开启。block_suspected_attack(bool, default: true):对“可疑”但未达严重阈值的请求是否也阻断;较激进,应视业务决定是否开启。block_sensitive_response(bool, default: true):当响应中命中敏感内容时阻断响应(response stage)。replace_fake_flag(bool, default: true):在检测到敏感 flag 时是否用fake_flag替换真实值以避免泄露。ip_rate_limit(bool, default: true):启用基于 IP 的速率限制。
-
flag_path(string, default: '/flag'):用于精确比对敏感内容的文件或目录路径;当block_sensitive_response打开时,会读取该路径下文件内容与响应做精确匹配。 -
flag_regex(string, default: '/flag{[^\r\n]{1,128}}/i'):响应内容的预筛正则,先用正则粗筛,再结合flag_path精确比对以降低误报。可根据目标敏感模式调整。 -
fake_flag(string, default: 生成随机值):静态假值,若留空,系统会基于flag_regex生成随机假 flag,用于替换真实 flag(当replace_fake_flag为 true 时)。 -
log_path(string, default: '/tmp/waf/data.log'):审计日志路径,日志为 JSON Lines 格式,每行一条请求记录。确保运行用户对该路径有写权限。 -
key_hash(string):面板访问密钥的哈希(仓库默认为md5哈希示例)。设置方法示例:md5('your_password'),并通过index.php?key=your_password访问面板。 -
max_input_bytes(int, default: 8192):采集请求体的最大字节数,过大会影响性能,过小可能截断有用载荷。建议保持在几 KB 级别,根据业务调整。 -
traffic_sampling_interval_ms(int, default: 1000):流量采样间隔(毫秒),低于 500 会被强制提升为 500。控制监控/采样频率,减小性能影响请适当调大。 -
ip_rate_limit_window_sec(int, default: 5):IP 速率限制窗口(秒),与ip_rate_limit_max_requests配合使用。 -
ip_rate_limit_max_requests(int, default: 20):窗口期内同一 IP 允许的最大请求数,超出触发速率限制逻辑(需ip_rate_limit开启)。 -
ip_rate_limit_store_path(string, default: '/tmp/waf/rate_limit.log'):速率限制的本地存储路径(简单实现用文件记录)。确保可写。 -
exclude_dirs(array):不监控的目录列表(相对或绝对路径),默认排除了./waf/自身以避免自监控干扰。 -
inject_root(string, default: '/var/www/html/'):注入或挂载扫描的根目录,用于注入脚本或遍历目标代码的位置。
支持的检测类型包括:
- SQL 注入
- SSRF
- SSTI
- XXE
- XSS
- RCE
- 文件上传
- 文件包含
- 反序列化
- 路径穿越
- DDOS
此外还支持:
- 敏感内容泄露检测
- fake flag替换
- 多层Base64,偏移Base64解析
- 综合评价体系判定恶意请求
- 检测高熵键值、参数洪泛、控制参数
- 分块检测
Tip
非必要请勿修改日志保存路径,除非你知道修改后会造成什么影响
data.log(JSON Lines 格式,无备份无轮转)
-
time:处理该请求的时间戳(建议 ISO 8601 格式)。 -
ip:客户端 IP 地址。 -
method:HTTP 方法(GET/POST 等)。 -
url:请求的完整 URL(含查询字符串)。 -
status:返回给客户端的 HTTP 状态码(如 200、404、500)。 -
alerts:逗号分隔的检测到的攻击类型列表,如果没有则为 ""。 -
suspects:逗号分隔的可疑点列表,如果没有则为 ""。 -
request_headers:原始请求头字符串,行与行之间用换行符分隔。 -
request_body:请求体内容 -
response_headers:原始响应头字符串,行与行之间用换行符分隔。 -
response_body:响应体内容 -
function_hits:一个对象,记录了本次请求中被触发的功能开关(如block_detected_attack)及其值。 -
blocked:布尔值,表示该请求是否被拦截。
示例:
{
"time":"2026-03-09 01:48:46",
"ip":"192.168.30.1",
"method":"GET",
"url":"/index.php?cmd=AAPD9waHAgZXhlYygkX1BPU1RbImNtZCJdKTs/Pg==",
"status":"403",
"alerts":"RCE,Upload",
"suspects":"",
"request_headers":"Host: 192.168.30.128\nConnection: keep-alive\nCache-Control: max-age=0\nUpgrade-Insecure-Requests: 1\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\nAccept-Encoding: gzip, deflate\nAccept-Language: zh-CN,zh;q=0.9\nCookie: PHPSESSID=q0d3vfl6kgq1pdvvnfjdfdvqol; security=low\nCookie: PHPSESSID=q0d3vfl6kgq1pdvvnfjdfdvqol; security=low",
"request_body":"-",
"response_headers":"Content-Type: text/plain; charset=utf-8",
"response_body":"Access denied.",
"function_hits":{
"block_detected_attack":true,
"block_sensitive_response":false,
"replace_fake_flag":false,
"ip_rate_limit":false
},
"blocked":true
}本项目采用 GPL-3.0 协议开源
欢迎提 issue 或提交 PR 来改进规则、降低误报或增强性能。
本项目仅供学习与研究使用,请勿用于非法用途。使用者需自行承担使用风险,作者不对任何因使用本项目而产生的直接或间接损失负责。
