Skip to content

SeanDictionary/waf-for-php

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WAF-for-PHP

一个用于 PHP 应用的轻量级注入式 WAF(检测 + 可选拦截 + 审计面板),以低侵入方式采集请求与响应并进行多层检测与审计。

要求

  • PHP 8.0+
  • Web 服务器(Apache/Nginx + PHP-FPM)
  • 进程权限能读取需要监控的应用目录

Note

如果目标环境需要兼容 PHP 7,请切换到 php7 分支

快速开始

  1. 将仓库放到应用可访问路径,如 /var/www/html/waf
  2. 配置:编辑 config.php(主要项见下节)。
  3. 启动监控脚本:
./start.sh start

脚本参数:start|stop|restart|status|clear

  1. 访问监控面板(非必须):
http://<host>/waf/index.php

alt text

仓库结构

  • 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 来改进规则、降低误报或增强性能。

免责声明

本项目仅供学习与研究使用,请勿用于非法用途。使用者需自行承担使用风险,作者不对任何因使用本项目而产生的直接或间接损失负责。

About

A Light waf for php server without root

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors