前言

之前参加了某运营商的众测项目,挖到了一个水平越权漏洞。这个洞不算高危,但胜在复现简单、影响面广,最终也过了。写个帖子记录一下过程,给想挖SRC/众测的朋友一点思路。

为什么选小程序

某运营商众测有个特点:要求资产必须有备案信息。这意味着很多测试环境、子域名、内部系统都不在范围内,暴露在公网上的资产其实不多。

Web端该挖的早被挖烂了,我就把目光转向了小程序

微信搜一下小程序名称,扫码登录,BurpSuite抓包,接口就出来了。小程序的好处是很多开发者会忽略安全测试,觉得”小程序嘛,又不是网站”,但其实小程序和Web端调的是同一套后端API。

挖洞过程

第一步:功能点遍历

拿到小程序后,我把每个功能点都点了一遍。重点关注涉及用户数据的接口:

  • 订单查询
  • 个人信息
  • 地址管理
  • 设备绑定

这些功能点通常会带用户标识参数,是越权漏洞的高发区。

第二步:抓包分析

用BurpSuite抓包,看每个请求的参数。重点看:

  • 有没有用户ID、手机号、订单号这类标识
  • 这些参数是前端传的还是后端从session取的
  • 如果前端传的,后端有没有校验归属

第三步:找到漏洞

在一个订单查询接口里,发现请求参数带了一个手机号字段

正常流程是:登录后查询自己的订单,前端自动带上当前用户的手机号。但如果我手动把手机号改成别人的,后端直接返回了别人的订单信息。

这就很离谱了——后端完全没有校验”这个手机号是不是当前登录用户的”。

为了确认不是偶然,我换了几个不同的手机号重复验证,每次都能拿到对应用户的订单数据。实锤了。

第四步:提交报告

按照标准格式写报告:

  • 漏洞类型:水平越权
  • 影响接口:订单查询API
  • 复现步骤:登录→抓包→改手机号→查看返回数据
  • 影响范围:所有用户订单数据可被任意访问
  • 修复建议:后端校验用户身份和资源归属,不能只靠前端传参

为什么是水平越权

有人可能会问:这算水平越权还是垂直越权?

判断标准很简单:

  • 水平越权:同级别用户之间的数据访问。A用户能看B用户的数据,但权限等级没变
  • 垂直越权:低权限用户访问高权限功能。普通用户能执行管理员操作

这个案例里,我用普通用户A的账号去访问普通用户B的订单,属于同级别用户之间的越权访问,所以是水平越权。

修复建议

这个漏洞的修复其实很简单:

// 错误写法:直接用前端传的手机号查订单
$phone = $_POST['phone'];
$order = query("SELECT * FROM orders WHERE phone = ?", $phone);

// 正确写法:从session获取当前用户的手机号
$phone = $_SESSION['user_phone'];
$order = query("SELECT * FROM orders WHERE phone = ?", $phone);

核心原则:用户身份信息从后端session获取,不要信任前端传参。

总结

这个洞的技术含量不高,但很典型。很多开发者会犯这种错误:前端传什么参数,后端就用什么参数,完全不校验归属关系。

挖众测/SRC的思路:

  • 资产收集:不要只看Web端,小程序、APP、API接口都是目标
  • 功能遍历:每个功能点都点一遍,重点关注涉及用户数据的接口
  • 参数分析:看请求参数里有没有用户标识,改一改试试
  • 重复验证:确认漏洞不是偶然,换几个账号/数据再试

水平越权是SRC里最常见的漏洞类型之一,复现简单、影响明确,适合新手入门。多看多试,总能挖到。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注