前言
之前参加了某运营商的众测项目,挖到了一个水平越权漏洞。这个洞不算高危,但胜在复现简单、影响面广,最终也过了。写个帖子记录一下过程,给想挖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里最常见的漏洞类型之一,复现简单、影响明确,适合新手入门。多看多试,总能挖到。
