-
-
HsWaf | 自用Waf分享
-
发表于: 2025-9-23 14:54 538
-
0x00 BackGround
近来,因为某些个人原因,需要一个Waf。测试了很多开源或不开源的Waf,总归是不如我意。这里就不引战般地介绍具体有哪些了。总之是感觉有太多太多可以扣的细节都没人扣,以至于随便在网上找一个小工具就能绕过。于是乎就有了这个项目。本着独乐乐不如众乐乐的原则,也分享给坛友用用。
0x01 概述
HsWaf 是一个基于规则和 AI 的 Web 应用防火墙(WAF),支持并且强制HTTPS,支持自动 HTTPS 证书签发(使用 ACME 协议的 Let's Encrypt)。配置文件采用 JSON 格式,主要包含站点列表(sites)、规则配置(rule)以及全局参数。
核心功能:
- HTTPS 代理和自动证书管理(独占 80 和 443 端口)。
- JA3 指纹检查(严格来说不是标准的JA3,有我的小巧思在里面)。
- 传统规则防护(防 SQL 注入、XSS 等)。
- AI 辅助防护。
- IP 速率限制和全自动黑名单。
- 维护模式(俗称拔网线模式)。
注意事项:
- 不要在外层套用其他反向代理(如 Nginx),以避免破坏 JA3 检查。
- 证书签发仅在程序启动时进行;重启会清除本地 IP 记录。
- 规则是给那些陈年老洞根本补不完的系统准备的,误判只比MobSec少一点;测试时建议按需启用规则。
- 它毕竟是我自用的,一来没做太多严谨的测试,可能边边角角的有一些bug(非常非常罕见的轻微内存泄露,差不多一个星期几MB的那种)误判(比如说某些苹果设备)就没修;有一些功能设计的也不怎么全(通配符啊路径重写啊)。
0x02 配置文件介绍
提供的下载文件里面是没有说明文档的,主要是因为我懒。写这里了:
站点列表(sites)
sites 是一个数组,每个元素代表一个站点配置。HsWaf 会根据 host_lower 匹配域名,并代理到指定的上游服务器(up_stream)。
站点配置对象(每个站点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | { // 证书文件路径。HsWaf 支持自动签发证书(使用 ACME),并独占 80/443 端口。 // 解析域名后自动获取证书。如果手动配置证书,需设置 acme_renew_days 为极大值(如 99999)以禁用自动续签。 "cert_file": "cert.pem", // 私钥文件路径。与 cert_file 对应。 "key_file": "key.pem", // 站点域名(必须小写)。必须精确匹配请求的 Host 头。 // 示例:example.com(不支持通配符或多个域名)。 "host_lower": "example.com", // 上游服务器地址。不支持路径(如 http://127.0.0.1:12345/path),仅支持主机:端口。 // 可以是本地地址(如 192.168.2.3:8080),而非仅限 127.0.0.1。 // 客户端真实 IP 通过 X-Forwarded-For 头传递给上游。 "up_stream": "066K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0p5J5x3K6b7#2", // 维护模式响应。如果非空字符串,则忽略 up_stream,直接返回此内容作为响应。 // 适用于临时关闭站点(如端口 12345 有敏感业务)。 // 示例:返回 "Under Maintenance" 页面;空字符串表示正常运行。 "maintain": "Under Maintenance (blank for non-maintenance)", // 禁用 WAF 功能。设为 true 时,仅作为 HTTPS 端点代理,不进行 JA3 检查或其他防护。 // 默认 false(启用 WAF),但对 Apple 设备可能不友好(因 JA3 风险控制)。 "no_waf": false} |
- 注意:
- 对于多个站点,仅需添加更多对象到数组中。
- 确保域名解析正确指向 HsWaf 服务器的 IP。未解析的IP是无法自动签发证书的。
- 如果上游是 HTTPS,
up_stream需指定https://,但 HsWaf 不验证上游证书。
规则配置(rule)
rule 对象定义基于规则的 WAF 策略。这些规则能拦截常见攻击,但可能产生误判,且性能一般(可能是数百微秒级的)。每个策略可独立启用/禁用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { // PHP 应用加固策略。启用后,针对 PHP 常见漏洞(如文件包含、命令注入)进行检查。 // 选项: "disabled"(禁用,默认)、 "block"(拦截)、 "log"(仅记录)。 "php_policy": "disabled", // Java 应用加固策略。针对 Java 常见问题(如序列化漏洞)。 "java_policy": "disabled", // 路径穿越防护。检测并拦截如 `../` 等路径操纵尝试。 "path_policy": "disabled", // XSS(跨站脚本)防护。扫描请求/响应中的脚本标签、事件处理等。 "xss_policy": "disabled", // SQL 注入防护。检测常见 SQL 关键字和注入模式。 "sql_policy": "disabled", // 扫描器防护。针对某些端口扫描、目录扫描等自动化工具。 "scan_policy": "ban", // 敏感文本内容防护(如 ZZMG)。 "zzmg_policy": "block"} |
全局配置
这些参数适用于整个 HsWaf 实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // 自动重启间隔(小时)。每 n 小时自动退出程序(会清除 IP 记录)。// 证书签发仅在启动时进行,因此这是必须的。"auto_reboot_hours": 48,// 请求速率限制恢复速度(毫秒)。控制单个 IP 的 QPS(查询/秒)。// 示例:5000 ms 表示最大 0.2 QPS(1 秒 / 5 秒 = 0.2)。// 限制真实请求数,而非连接数。"ms_per_req": 5000,// 突发请求上限。允许短期超过速率限制的请求数。// 示例:20 表示可在短时间内处理 20 个突发请求(如加载静态资源)。"burst_limit": 20,// 垃圾回收间隔(分钟)。清理内存中的临时数据(如旧日志)。"gc_interval_minutes": 10,// IP 黑名单保存时长(分钟)。违规 IP 在此时间内被封禁。"ip_keep_time_minutes": 60,// IP SNI 配置。对于 ACME 类型 "shortlived",可签发 IP 证书。// 示例:若签发 IP 证书,设为服务器 IP(如 "192.0.2.1");否则为空字符串(默认,使用域名)。"ip_sni": "",// AI 模式开关。启用后,AI 分析请求(黑箱模型),封禁可疑行为。// 效果好,性能一般,稳定性性差(保不准多试几次一模一样的就漏了一个);默认 true(推荐)。"ai_mode": true,// ACME 证书类型。// - "classic":标准证书。// - "tlsserver":非必要信息为空白的证书,更省流量(默认)。// - "shortlived":短期证书,更安全,但需频繁续签(最近好像发不了)。"acme_type": "tlsserver",// 证书续签阈值(天)。超过此天数自动续签。// 示例:30 天;手动证书时设为 99999 禁用自动续签。"acme_renew_days": 30 |
- 速率限制详解:
- 使用令牌桶:每
ms_per_reqms 生成一个令牌,桶容量为burst_limit。 - 超过限制:返回错误但不拉黑 IP。
- 使用令牌桶:每
0x03 碎碎念
截止发稿日,经笔者自行(不怎么严谨的)测试,效果还是不错的。大部分扫描器一扫就黑,还出人意料地拦住了HTTP Debugger Pro等外加调试工具。只能说它在我的应用场景下是好的;如果坛友们有什么想加/改的也欢迎回帖,回帖我大部分都会扫一眼...就这样?
0x04 下载
见附件。
最后于 2025-9-23 15:14
被the_hs编辑
,原因:
赞赏记录
参与人
雪币
留言
时间
nahenmei
你的帖子非常有用,感谢分享!
2025-11-12 15:52
mb_vlzxhmta
+2
你的分享对大家帮助很大,非常感谢!
2025-9-23 21:40
赞赏
他的文章
- [原创] 试论人工智能安全:以AI文本重风格化为例 468
- HsWaf | 自用Waf分享 539
- [原创] AnubisWAF的分析 525
- [下载]HsRisk IPv4风险数据库 4979
- PythomProtect - Python 混淆器 8697
赞赏
雪币:
留言: