docs: 补 XML-RPC 端点行为、动态 token 与 .php 变体说明,记实现取舍
This commit is contained in:
@@ -113,3 +113,43 @@ IPv6 丢掉了精确地址(IPv4 无损);邮件里也只给键,运维会
|
||||
**新工具** `dev/preview-honeypot`:渲染 9 个家族到 `outputs/honeypot-preview/index.html`,
|
||||
配 chrome headless 截图核对外观。靠它发现两处「源码看不出、截图一眼假」:
|
||||
Tomcat 的 skin 忘了 css(按钮白字无底色)、WP 登录页底部挂着 404 文案。
|
||||
|
||||
### 测试环境验收:9 家族伪装(部署 7225f68 后,只读 GET)
|
||||
|
||||
全部符合预期:8 个家族 title/generator 各不相同、Tomcat 401+Basic realm、
|
||||
静态资源 200 且 MIME 正确(128B css / 81B js / 70B png)、插件目录 .php 回 404、
|
||||
业务路由(/login /user /static /api)无 canary、界外路径仍 302 → /。
|
||||
|
||||
发现的漏洞(按优先级):
|
||||
1. **P1 `/xmlrpc.php` 回 HTML 登录页** —— 而我们自己发了 `X-Pingback: /xmlrpc.php`,
|
||||
真实 WP 回 text/xml,等于自己指给自己一个明显假的地址;同时丢掉 WP 爆破最有价值的
|
||||
捕获通道(xmlrpc system.multicall 一次可试上千组,绕开登录限速)。
|
||||
2. **P2 每次请求恒定值**:PMA `token=e1a4c0b7d2f58g93`(还带非 hex 的 g)、
|
||||
generic `csrf_token=a7f3c1e9b2d4`、`X-Jenkins-Session: 8b1f2c4d`。
|
||||
两次请求完全相同 → 跨请求指纹即可识别。应改每请求随机。
|
||||
3. **P2 `X-Pingback` 用相对路径**,真实 WP 给绝对 URL。
|
||||
4. **P3 `/phpinfo.php` 漏匹配**:路径清单里是 `/phpinfo`、`/info.php` 精确项,
|
||||
段前缀匹配不覆盖 `.php` 变体 → 302。可加「p 去掉 .php 后在集合内」的兜底。
|
||||
5. **P3 `/wp-json/wp/v2/users` 回 HTML**,真实 WP 回 JSON(用户枚举接口)。
|
||||
6. P3 `X-Frame-Options: DENY` / `Cache-Control: no-store` 与真实 WP 不同,
|
||||
但属全局中间件,改动影响全站。
|
||||
|
||||
### 修 P1/P2:XML-RPC 端点 + 动态 token + .php 兜底
|
||||
|
||||
- 新增 `internal/security/honeypot/xmlrpc.go`:`/xmlrpc.php` 不再回登录页。
|
||||
GET→405+XML fault「XML-RPC services are disabled」;POST methodCall→200+fault
|
||||
「Incorrect username or password」;POST system.listMethods→方法列表模板。
|
||||
凭据提取用正则(不上 encoding/xml,蜜罐高频命中):抓 `<string>`、剔除
|
||||
methodName 与 http(s) URL、两两配对;`blog_id=1` 这种「奇数长度+首项短数字」
|
||||
会丢首项纠正错位;第一组进标准字段,其余进 `cred2.*`,原始串全量进 `xmlrpc.N`
|
||||
(配置上限 16 对 / raw 8KB)。
|
||||
- 动态占位符:`LoginPageVars.Nonce`(32 hex,`math/rand/v2`,刻意不用 crypto/rand,
|
||||
这些是假 token 只需「每次不同」)。支持 `$hex8/16/32` 与 `$base`;
|
||||
页头、hidden、Set-Cookie 共用同一套 nonce。
|
||||
- `X-Pingback` 改绝对地址(`$base/xmlrpc.php`),没配 `external_url` 就不发。
|
||||
- `Cache-Control` 从 `no-store` 改 `no-cache, must-revalidate, max-age=0`(更像 WP/PMA)。
|
||||
- Grafana/GitLab 补真实会种的会话 cookie(`grafana_sess`、`_gitlab_session`,动态)。
|
||||
- `Match` 增加 `.php` 变体兜底:`/phpinfo.php` 之前漏匹配 → 302。
|
||||
- 性能:RenderFamily 3.7µs→4.18µs、2→3 allocs(多的一次是 hex 编码),可接受。
|
||||
|
||||
四处变异验证有效(固定 token / xmlrpc 分支失效 / Pingback 相对路径 / .php 兜底失效)。
|
||||
|
||||
Reference in New Issue
Block a user