zzzcms 后台入口越权访问与信息泄露风险分析

GobySec  5小时前

uid 参数的访问控制缺口出发,讨论批量路径探测的代价与判定边界

漏洞类型越权访问 / 信息泄露
综合评分CVSS 3.1 · 7.5(高危)
影响产品zzzcms(官方当前以 zzzphp 名义发布)建站系统
披露时间2021-11-29
相关编号CNVD-2018-17439(同源越权访问问题,2018-09-13 披露)
标准编号未分配 CVE、CNNVD 编号
影响版本公开资料未给出明确的受影响版本区间,无法核实具体版本边界

摘要

该问题位于建站系统后台入口的访问控制环节:未认证请求在访问带有 uid 参数的后台路径时,没有落到预期的登录拦截,而是返回了携带特定页面标识的跳转响应。攻击者据此可以枚举后台入口、判断目标是否处于可被进一步利用的状态。

本文把可观测层与影响层分开讨论:可观测层是「未认证请求拿到了一个带特定标识的跳转响应」;影响层是「该响应是否直接泄露了敏感数据」——后者取决于具体部署与版本,公开资料未给出可直接读取的敏感文件清单。因此本文的定位是访问控制边界的验证方法,而不是一条已经跑通的利用链。

01 产品背景

zzzcms 是一款国产免费开源建站系统,面向站长群体,官方站点为 http://www.zzzcms.com/。产品提供模板化建站与内容管理能力,前台用于展示站点内容,后台用于站点配置与内容维护。官方当前以 zzzphp 名义发布新版本,版本线已推进至 V3.x(官方更新公告中提到对 PHP 8.4 的支持)。

需要留意的是,官方站点的页面标题随版本演进已发生变化。在做资产检索时,仅以历史标题做精确匹配会漏掉较新的部署,这一点在下面的资产识别部分会具体说明。

02 漏洞概述与影响评估

两个层次要分开看

层次内容
可观测层未认证请求后台入口时,返回的不是登录拦截,而是 302 跳转 + 特定页面标识(id="question")。这一差异可被外部观测,用于枚举与筛选目标。
影响层该响应本身是否直接泄露敏感数据,取决于部署与版本。公开资料未给出可直接读取的敏感文件清单,因此不能断言「未认证即可读取站点敏感信息」。

危害链条

即便影响层尚未确认,可观测层的差异本身就具有攻击价值:

  • 后台入口枚举。 后台路径存在多种形态,逐一探测即可确定哪些入口存在、哪些返回异常响应。
  • 目标筛选。 大规模资产中,能稳定返回该特征的站点即为「后台暴露且拦截不完整」的目标,可直接作为后续尝试的优先队列。
  • 版本与部署推断。 响应形态差异可用于推断目标版本区间与中间件配置。
  • 越权读取(待确认)。 若响应体中确实包含本应登录后才能看到的业务数据,则构成实质越权;这一点必须在真实目标上核对,不能由特征命中直接推出。

评分

按 CVSS 3.1 评估,综合评分 7.5(高危),向量 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N:攻击向量为网络可达、攻击复杂度低、无需认证(PR:N)、无需用户交互、作用域不变;机密性影响按「可越权读取站点敏感信息」计为高(C:H),完整性与可用性不受直接影响。

该分值对应「影响层成立」的情形。若经核实目标仅存在可观测层差异、响应体不含业务数据,机密性影响应下调。

03 影响范围

公开资料未给出明确的受影响版本区间。国家级漏洞库曾以 CNVD-2018-17439 编号登记一个同源的越权访问问题(2018-09-13 披露,描述为攻击者可通过该问题越权访问敏感文件,厂商当时未提供修补方案),说明这类问题在 zzzcms 上具有延续性。

判断自身是否受影响,应以「未认证访问后台入口是否被正确拦截」为准,而不是以版本号为准。若后台管理界面直接暴露在公网且拦截不完整,风险最为直接。

04 成因分析

  • 访问控制依赖单一入口的分支判断。 后台拦截由统一入口按参数分支处理,uid 一类的参数未参与权限校验,构造特定参数即可走到未被拦截的分支。
  • 路径形态未被完整覆盖。 后台入口存在带数字后缀的多种形态,拦截规则只覆盖了标准路径,其余形态成为缺口。
  • 「返回跳转」被等同于「已拦截」。 实际返回的跳转响应中仍携带页面标识,构成了外部可观测的差异;管理员看到 302 便认为拦截生效,掩盖了问题。
  • 后台与前台同域暴露。 建站系统通常前台必须公开,后台却与前台共享同一域名与入口前缀,安全边界依赖代码逻辑而非网络隔离。

05 资产识别与指纹

资产检索语句

title="zzzcms" || body="zzzcms.com"

可叠加前台模板中的页面特征进一步收敛,例如品牌列表相关路由中出现的 brandlist 字符串:

title="zzzcms" || body="brandlist"

检索语句的取舍说明:一些资料中流传的检索语句会把整条 OR 链原样重复两遍(形如 (A || B || C || D) || (A || B || C || D)),属于明显的冗余错误;其中部分 body= 条件使用 CSS 选择器风格的字符串,在实际 HTML 中不一定逐字出现。与其照抄,不如以上面收敛后的语句为主,再结合产品名与官方域名做交叉验证。

探测请求包(未认证)

GET /admin/?admin/uid=1 HTTP/1.1
Host: 192.0.2.30
User-Agent: Mozilla/5.0
Accept: */*
Connection: close

(192.0.2.30 取自文档保留网段,为示意地址,不对应任何真实主机。)

判定条件由三项同时满足构成:

  1. 响应状态码为 302
  2. 响应体中包含页面元素标识 id="question"(问题 / 问答型页面的元素标识);
  3. 不跟随重定向——只观察第一跳响应,这是该判定成立的前提。

一个值得单独指出的细节:按 HTTP 语义,302 响应通常不携带响应体,而该判定同时要求响应体中出现特定标识。这说明目标在重定向响应中回写了页面内容。该行为需要在真实目标上逐一核对:若目标返回的是空响应体的 302,则第二项条件不会命中,判定失效。这也是该特征在不同部署上表现不一致的原因。

配套的路径枚举

/admin/ 之外,同一判定逻辑还会对带数字后缀的后台入口逐一发起相同请求,即 /admin1/ 一直到 /admin999/,共 1000 个候选路径:

GET /admin1/?admin/uid=1    → 302 + id="question"
GET /admin2/?admin/uid=1    → 302 + id="question"
...
GET /admin999/?admin/uid=1  → 302 + id="question"

代价与风险提示:1000 次请求会形成非常明显的访问特征,极易触发 WAF 拦截、速率限制或日志告警,也可能对目标造成不必要的负载。在授权测试中应先与资产方确认请求规模;必要时先人工确认单个路径的行为,再决定是否扩展。不建议在生产环境直接跑满整个区间。

06 认证边界验证方法

以下步骤均为只读,不提交任何表单,不尝试登录。

  1. 先确认目标身份。 通过前台标题、模板特征与官方域名特征确认是 zzzcms / zzzphp 部署。
  2. 发起单点请求。 未认证请求 /admin/?admin/uid=1,记录状态码、Location 响应头与响应体。
  3. 同时记录最终落点。 再发一次跟随重定向的请求,记录最终页面的状态码与内容。这一步用于区分「跳转到登录页」与「跳转到其他内容」——只记录第一跳会丢失关键信息。
  4. 判定拦截是否真的生效。 若响应体只是登录页 / 问答页的渲染结果,说明拦截仍然生效,只是返回形态不同;若响应体中出现了本应登录后才能看到的业务数据(配置项、用户信息、路径清单等),才构成越权读取。
  5. 路径形态按小步长抽样。 如需确认拦截覆盖范围,先取少量代表性路径验证行为一致性,再决定是否扩展。切勿直接遍历整个区间。
  6. 记录中间件行为。 记录响应头与状态码分布,判断是否存在 WAF;若存在,命中结果可能被中间件行为污染。

误报风险

  • 302 是登录拦截最常见的实现方式,「返回 302」本身不等于「未拦截」。必须结合响应体与最终落点判断。
  • id="question" 是页面元素标识,区分度中等,可能被其他页面的模板复用,从而造成误命中。
  • 空响应体的 302 不会命中第二项条件,造成漏报。
  • WAF 拦截后常统一返回 302 或自定义错误页,会同时造成误命中与漏报。
  • 因此该判据应定位为「访问控制行为观测」;结论必须由第 3、4 步支撑。

07 修复建议

  1. 后台入口统一做服务端鉴权。 不依赖路径形态或前端路由,对 /admin/admin1 直至带任意数字后缀的所有形态做一致处理。
  2. uid 等参数做严格校验。 参数不应影响路由分支与权限判定;对未认证请求一律在鉴权层拦截。
  3. 登录拦截返回明确状态。 使用 401/403 或跳转到统一登录页,不要在重定向响应中回写业务页面内容——这既是安全隐患,也是信息泄露的观测点。
  4. 增加后台入口的访问频率限制与告警。 对短时间内大量访问 /admin* 的源地址进行封禁与告警,可有效发现路径枚举行为。
  5. 收敛后台暴露面。 如非必要,禁止后台管理界面直接暴露在公网;可通过 IP 白名单、二次认证或独立管理域名降低风险。
  6. 保持版本更新。 关注官方发布说明(官方当前以 zzzphp 名义发布 V3.x 版本线),及时跟进修复。

08 参考资料

授权声明

本文用于授权范围内的安全评估与防御加固参考。文中所有主机地址均取自文档保留网段(192.0.2.0/24 等),为示意地址,不对应任何真实系统。请勿在未获得明确书面授权的情况下对任何系统执行本文所述的验证操作;未获授权的测试可能违反相关法律法规,风险由操作者自行承担。

最新评论

昵称
邮箱
提交评论