fix(honeypot): cleanPath 处理零宽字符,并在清洗生效时打诊断日志
上一版只用 strings.TrimSpace,实测漏掉「看不见但不算 White_Space」的字符:
cleanPath("\u200b/wp-login.php") = "/\u200b/wp-login.php"
(零宽没被删,还因为首字符不是 '/' 多补了一个斜杠,拼出更怪的路径)
改为 TrimFunc 同时匹配 unicode.IsSpace 与 U+200B/200C/200D/FEFF,且只处理首尾
—— 中间的零宽字符可能是攻击 payload,取证要保留原样。
另加诊断日志:清洗前后不一致时 WARN,用 %q 打出原始值。
测试环境出现过「记录里 path 带前导空白、本地链路却复现不出来」的情况,
不可见字符必须转义输出才定位得到。
测试:TestCleanPath 补零宽空格 / BOM / 中间零宽字符保留三个用例。
This commit is contained in:
@@ -315,3 +315,17 @@ CLI 端到端手动验证:`honeypot hits` / `--ip` / `--show-password` 输出
|
||||
- `566b13e` fix(conf): 样例配置去掉行尾注释(2 文件)
|
||||
- `c29e1d0` fix(honeypot): 补齐封禁装配与诱捕语义,凭据外置为文件不再入库(21 文件)
|
||||
- `main` ahead of `origin/main` 2;用户要部署测试环境验证后再决定推送。
|
||||
|
||||
### 测试环境实测反馈(同日晚,已修并推送)
|
||||
现象:purge-creds 删 4 列成功、GET 200、POST 后 GET 403、文件已生成。
|
||||
但凭据文件里 `"path":" /wp-login.php"`(前导空格)、`"ip":"127.0.0.1"`。
|
||||
|
||||
- **path 脏字符**:反代链路(CF → nginx → 源站)传出的 `req.URL.Path` 带前导空白。
|
||||
`Match` 内部 normalize 会 TrimSpace 所以仍命中,但落库与假表单 action 用原始值
|
||||
→ 取证数据脏、爆破脚本可能提交到错误路径。本地 httptest 复现不出来,是环境相关。
|
||||
修复:`cleanPath()` 在 Serve 入口 trim + 补前导斜杠(不改大小写)。
|
||||
- **IP = 127.0.0.1**:说明 `trust_proxy` 未开。后果不只是取证失真 ——
|
||||
**一次蜜罐封禁会封掉 127.0.0.1,等于封掉整站所有访客**(封禁是内存态,重启即恢复)。
|
||||
修复:命中回环地址且 `!trust_proxy` 时打一次性 WARN(24h 冷却),不改封禁行为。
|
||||
sample.ini 的 trust_proxy 段补了蜜罐相关说明。
|
||||
- `846bb8a` 已推送(`5e8deca..846bb8a`)。
|
||||
|
||||
Reference in New Issue
Block a user