免责声明:本文所述内容仅用于网络安全技术交流与学习。任何形式的渗透测试都必须在获得合法授权的前提下进行。读者应自觉遵守法律法规,违规使用造成的一切后果与本文及作者无关。
前言
在一次众测项目中,我经历了一次典型的漏洞链式挖掘。整个过程以弱口令为起点,获取管理员权限后,发现了另一客户端程序存在任意用户登录漏洞,并由此挖掘出未授权越权访问,以及后续多个接口的SQL注入。可以说,系统在安全防护上几乎全面失守。
弱口令突破
目标是一个小区管理系统的小程序,分为服务端和客户端。首先分析的是服务端。

访问后发现需要认证,且没有注册或短信验证码登录功能,仅有账号密码登录入口,也没有找回密码选项。不过,可以推断出账号应为手机号格式。

随意输入一个手机号进行抓包,服务器返回了“账号密码错误”的提示。这意味着可以进行密码爆破。

使用常用密码字典进行爆破,很快便成功爆破出一个账号:手机号 187xxxx,密码为 123456。

登录后发现,该账号拥有管理员权限,可以查看和管理小区内所有住户信息。

任意点击一个住户,可以看到其姓名、手机号、住宅地址等敏感信息,并且管理员拥有高阶权限,如为用户增加积分、兑换礼品等。

此外,管理员还可以切换小区,获取其他所有小区的用户信息。初步统计,泄露的住户信息高达2万户。

发现首个SQL注入
通过对服务端小程序进行反编译,可以梳理出大量的API接口。

在测试小程序功能时,发现了一个 search 接口,其 query 参数存在注入点,输入单引号直接触发数据库报错。

漏洞利用没有难度,直接通过报错注入便成功获取到了数据库用户名。

使用 sqlmap 工具进行自动化验证,同样可以成功注入,说明后端未对输入做任何有效过滤。

发现第二个SQL注入
在测试过程中,还发现了另一个接口 xxx/xxcycle 也存在SQL注入,报错方式与第一个如出一辙。

直接使用上述的payload,将目标改为获取数据库名,很快就得到了回显,数据库名为 xxxge。

除此之外,系统中几乎所有存在查询输入的地方都发现了SQL注入点,安全防护措施基本为零。
客户端任意用户登录
在分析过程中,发现了该系统的另一个小程序,即客户端。

客户端访问时需要输入卡号或手机号进行登录。直觉判断,这里可能没有二次验证,理论上可以通过爆破手机号实现任意账号登录。但使用常规字典尝试爆破未果,考虑到爆破真实手机号耗时过长,遂暂时放弃。

不过,我们已经在服务端掌握了管理员权限,其中包含了大量的住户真实手机号。随机选取一个手机号尝试登录客户端,竟然直接成功了。这证实了客户端存在任意用户登录漏洞。

未授权访问与越权
对客户端小程序进行反编译,发现了一个 xxx/info 接口。

该小程序功能简单,通过分析JS代码可知,此接口为POST请求,参数是JSON格式的 id 值。

直接随意输入一个数字ID进行访问,成功越权获取到了对应用户的敏感信息。更值得注意的是,这些ID值是连续且有序的。

通过进一步测试,发现ID值从1到63999几乎都存在对应的用户数据。同时,在请求头中并未发现Token等认证字段,这意味着该接口同时还是一个未授权访问漏洞。

小结
本次渗透测试清晰地展示了一个系统如何在多个层面存在安全缺陷:从最基础的弱口令,到业务逻辑漏洞(任意登录),再到访问控制缺失(未授权、越权),最后是致命的数据层漏洞(SQL注入)。这种“链条式”的漏洞往往能造成更严重的危害。对于开发者而言,需要在设计、开发、测试各阶段都引入安全思维;对于安全人员,则需要具备这种由点及面、深入挖掘的探索能力。如果你对这类实战漏洞分析感兴趣,欢迎到云栈社区的安全板块与更多同行交流探讨。
