声明:本文相关技术仅用于安全研究,请勿用于非法测试。
最近在一次授权渗透测试中,目标是一个小程序。整个测试过程颇为典型,发现了一处由接口信息泄露导致的严重垂直越权漏洞,最终实现了任意账号登录。下面我将详细复盘这次测试。

拿到小程序后,首先进行常规操作:点击登录,使用手机号授权。整个过程非常顺畅。

登录进入系统后,我发现功能点并不多,感觉可测试的面比较窄。于是决定跳出小程序的限制,尝试对其后台域名进行目录扫描,看看能否发现一些隐藏的路径或敏感信息。

最初使用 dirsearch 进行常规扫描,结果一无所获。这时我想到,很多接口可能需要进行身份认证才能访问。于是,我将登录后获取到的认证凭证(如Token)加入到扫描请求头中再次尝试。
果然,这次有了重大发现:扫描到了一个 Swagger API 文档 地址。这对于安全测试人员来说,无疑是一个极好的开端,因为它几乎等于拿到了系统的“接口说明书”。

常言道,好的开始是成功的一半。在浏览这些API接口时,我特别注意那些与用户信息相关的端点。很快,一个名为 user/list 的接口引起了我的注意。初步测试发现,该接口的权限校验似乎存在缺陷,导致通过我的账号凭证可以查询到小程序所有注册用户的简要信息,包括一个关键字段——user_name。

当然,仅仅获取用户列表还不是最严重的。关键在于回顾小程序的登录机制。通过分析授权登录流程的请求(剔除无关参数后),我确认其核心是依赖微信的 openid 作为用户身份标识进行登录的。
而巧合的是,从 user/list 接口获取到的 user_name 字段值,正是其他用户的 openid。到这里,一条完整的攻击链就清晰了:
- 攻击者登录自己的正常账号。
- 利用有缺陷的
user/list 接口,窃取其他用户的 openid(即user_name)。
- 模拟登录请求,将窃取到的
openid 替换到登录参数中。
- 服务器错误地将该请求识别为目标用户的合法登录,从而返回目标用户的登录态。
我立即进行了验证,使用获取到的他人 openid 发起登录请求,果然成功地、丝滑地登录了其他用户的账号,实现了完全的账号接管。

漏洞总结与反思:
这个案例暴露了两个关键问题:一是开发环境或测试环境的 Swagger 等调试接口 不应暴露在生产环境;二是后端接口,尤其是涉及用户敏感数据的接口,必须进行严格的权限校验(如判断当前请求用户是否有权查询目标数据),不能仅凭一个有效的登录Token就放行所有操作。开发者需要时刻牢记“最小权限原则”,并在上线前进行充分的安全审计。
这种由多个“小问题”串联形成的严重安全风险在实际中并不少见。如果你在开发或测试中遇到过类似有趣或惊险的案例,欢迎到云栈社区的安全板块分享交流,共同提升安全防御意识与能力。
|