找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3405

积分

0

好友

455

主题
发表于 昨天 20:27 | 查看: 4| 回复: 0

前言

在一次授权渗透测试项目中,客户只提供了一个后台管理系统的登录页面,没有提供任何测试账号。面对这种常见的“孤岛式”入口,我们如何突破认证、获取权限,并进一步探索系统功能呢?本文将结合一次实战案例,分享从前台登录到成功渲染后台功能菜单的完整思路与过程,其中的一些方法和思考或许能为你的测试工作带来启发。

1. 后台权限获取

首先映入眼帘的是一个标准的后台登录界面。

后台系统登录页面

界面本身平平无奇。尝试对常见弱口令进行爆破,但没有收获,测试一时陷入僵局。

实际上,面对仅有登录页面且无测试账号的情况,我们可以尝试多种思路来获取后台权限,例如:

  1. 爆破常见弱口令。
  2. 在源码(如JS、HTML注释)中寻找硬编码的账号密码。
  3. 分析前端JavaScript的登录认证逻辑,判断是否为前端验证(例如依赖返回包中的特定字段值)或存在认证缺陷(例如仅需特定的HTTP Header)。
  4. 获取系统内其他角色(如普通用户、机构用户)或可注册的前台用户的认证凭据,尝试越权登录后台。
  5. 寻找隐藏的注册功能点。
  6. 从JavaScript文件中挖掘敏感API接口,并尝试直接调用。
  7. 在登录口尝试SQL注入等漏洞。
  8. 利用系统依赖的中间件或组件的已知漏洞。

在这次测试中,通过信息收集,我们发现了一个与Web后台系统同名的微信小程序。关键点在于,小程序与Web后台使用了相同的域名和核心认证体系。于是,我们尝试将微信小程序通过手机号快捷登录后获取的认证Token,替换到Web后台登录接口的响应包中。

小程序登录请求与响应包

通过抓包替换,成功“骗过”前端,触发了后续的后台API请求。

成功触发后台请求

然而,浏览器页面却是一片空白,没有任何功能菜单显示。这通常意味着我们获取到的账号权限不足,导致后端没有返回高权限的菜单数据,前端因此无法渲染出任何功能模块。

2. 获取后台接口与数据

页面空白,但网络请求已经发出,这说明我们已经进入了“后台”,只是看不到“家具”。接下来的目标就是找到那些“隐藏的家具”——后台的功能接口。

2.1 常规思路:挖掘JS中的接口

最直接的方法就是分析前端加载的JavaScript文件,从中寻找潜在的后台API接口。即使当前账号无权访问,很多接口地址和参数定义也可能直接写在JS里。

在JS源代码中搜索到的接口

挖掘JS时有个细节需要注意:页面默认加载的JS文件可能并不全。许多现代前端应用会使用代码分割(Code Splitting)技术,按需加载模块。

index.html中预加载的JS和CSS资源

你可以通过搜索已发现的部分接口名,来查找其他未被加载的相关JS文件。将这些文件URL收集起来,用脚本批量访问,就能“提前”获取到更多的接口信息。这种方法简单直接,但缺点也很明显:如果接口的传参逻辑复杂且没有明文写在JS里,仅凭接口地址构造有效请求会比较困难。

2.2 寻找接口文档或相关接口

除了在JS里大海捞针,寻找接口文档(如Swagger UI)是更高效的途径。如果找不到标准文档,可以观察登录后浏览器发出的首个或关键的菜单请求。

例如,本次测试中,登录后浏览器发起了一个获取菜单的请求。

获取菜单的请求包

获取菜单的响应包为空

从接口名 initMenu 可以明确其作用。响应体为空,印证了账号权限不足的判断。那么,能否找到另一个返回完整菜单数据的接口呢?

首先分析 initMenu 接口的请求参数。通过浏览器开发者工具在相应加密函数处打上断点,可以获取到调用时的明文参数。

在加密函数处打点获取明文参数

这里发现请求体是空的,意味着通过修改请求参数来获取更多数据的方法行不通。

接着,我们在全局代码中搜索与“Menu”相关的关键字,成功发现了一个名为 initMenutree 的接口,从命名上看,它很可能返回完整的树形菜单数据!

在配置文件中发现initMenutree接口

直接访问该接口返回400错误。这在意料之中,我们需要模仿 initMenu 接口的请求格式来构造请求。通过断点调试,我们获取了请求所需的签名参数。一个有趣的发现是,在测试时起初忘了对请求体进行加密,但后端竟然也正常处理了。

构造请求时控制台的签名生成过程

使用正确的参数发送POST请求后,我们成功获得了包含完整功能菜单树的响应数据!

initMenutree接口的成功响应,包含完整菜单树

思路很清晰了:将这个完整的菜单数据包,替换到我们低权限账号发出的 initMenu 请求的响应中,应该就能让前端渲染出功能页面。然而,替换之后页面依然空白。

3. 逆向前端逻辑,成功渲染页面

替换数据包失败,说明前端对这两个接口返回数据的处理逻辑可能不同。我们需要深入分析前端JavaScript是如何处理 initMenu 接口的返回值的。

分析前端JS对initMenu返回值的处理逻辑

关键代码在此:let data = res.data.data;
前端在渲染菜单时,直接从响应结果的 res.data.data 中取数据。

而我们之前从 initMenutree 接口获得的菜单数据,其完整路径是 res.data.data.tree。直接替换导致前端在 res.data.data 中找不到预期的数据结构,因此渲染失败。

修改响应包结构前,字段不匹配导致失败

问题根源找到了,解决方法也很简单:我们需要修改响应包,将 initMenutree 返回的 data.tree 内容,提升到 initMenu 接口期望的 data 层级。用更直白的话说,我们需要把 {data: {tree: [...]}} 的结构,改成 {data: [...]}

在控制台演示数据结构差异

通过抓包工具(如Burp Suite)拦截 initMenu 的响应,按照上述规则修改JSON结构后放行。刷新页面,期待已久的功能菜单终于成功渲染出来!

成功渲染出的后台功能菜单界面

至此,我们不仅绕过认证进入了后台,还“解锁”了全部功能菜单的可见性,为后续深入的渗透测试和漏洞挖掘铺平了道路。后续的测试中,通过抓包分析,发现了多处垂直越权等常规漏洞,此处不再赘述。

总结与思考

本次测试流程可以概括为:信息收集发现同名小程序 -> 利用统一认证体系绕过Web登录 -> 分析前端逻辑寻找高权限数据接口 -> 修改接口响应数据结构欺骗前端渲染

整个过程涉及了对前端应用架构、API交互逻辑和数据结构分析的深入理解。它提醒我们,在现代Web应用安全测试中,突破认证往往只是第一步。在“进入”系统后,如何利用客户端逻辑、挖掘隐藏接口、理解数据流转,是进一步发现深层次业务漏洞的关键。这种深入客户端逻辑的分析能力,是高级软件测试工程师和安全研究员的重要技能。

希望这个案例分享能为你带来一些新的测试思路。如果你对Web安全、漏洞挖掘有更多兴趣,欢迎到 云栈社区 与更多开发者交流探讨。




上一篇:AI浪潮冲击手机供应链?LPDDR5X与SOCAMM2技术内幕
下一篇:AI时代代码消费品化:“日更”模式如何颠覆传统软件工程
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-22 03:02 , Processed in 0.839358 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表