越权访问漏洞:水平越权与垂直越权案例
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
越权访问是业务系统最常见、也最容易被忽视的漏洞:页面把“我的订单”入口隐藏了,但接口本身没校验归属——攻击者改一下 URL 里的 ID,就能看别人的数据。它与 SQL 注入不同,不需要特殊构造的输入,只需要“换一个参数值”。
两类越权的定义与案例
水平越权:同级用户之间互相访问对方的数据。典型案例:订单详情接口 /order/detail?id=123,服务端只判断了“是否登录”,没判断“这单是不是你的”——把 id 改成遍历值,别人的订单全部可见(含姓名、电话、地址)。这类也叫 IDOR(不安全的直接对象引用)。
垂直越权:低权限用户执行高权限功能。典型案例:管理后台接口 /admin/user/delete 没有校验角色,普通用户直接 curl 调用即成功。攻击者从前端 JS 里发现隐藏的管理接口地址,绕过“按钮不显示”的假防护。
为什么前端隐藏不是防护
很多开发者以为“管理菜单不显示给普通用户”就安全了。实际上前端的任何东西都在用户手里:接口地址能从 JS、网络请求里看到;请求参数能用浏览器开发工具随意改。安全必须由服务端在每个请求上强制校验——前端只是体验优化,不是安全边界。
防护方法:服务端强制鉴权
核心原则:每个请求都要校验“当前身份 + 目标资源归属 + 操作权限”。落地要点:① 身份从服务端会话取:当前用户 id 从 session/token 解析,绝不接受请求参数里的 userId;② 资源归属校验:查询时带上归属条件——SELECT * FROM orders WHERE id=? AND uid=?,一条 SQL 同时完成查询与鉴权,比“查出来再判断”更不易遗漏;③ 角色校验:管理接口在路由层统一拦截校验角色,而不是每个方法里散落判断;④ 用间接引用:对外暴露随机 token 而非自增 ID,降低遍历成本(但不能替代归属校验);⑤ 审计与测试:写自动化用例模拟“用户 A 的 token 访问用户 B 的资源”,上线前跑一遍;把越权测试纳入渗透测试必测项。
常见易漏点
① 新增接口忘了加校验——权限校验要靠路由层统一拦截兜底,而不是依赖每个开发者的自觉;② 文件下载/图片接口:/download?file=123 直接按 ID 给文件,不校验归属;③ 导出、批量操作接口:列表有校验,导出接口漏了;④ 前后端分离时的“公开接口”:未登录可调用的接口往往是最薄弱的;⑤ 内部接口:以为内网就安全,一旦 SSRF 或边界穿透就全线失守。
总结
越权漏洞的根源是“信任了客户端”。防护的一句话原则:服务端对每个请求执行“身份校验 + 归属校验 + 权限校验”,三者缺一不可。水平越权靠资源归属条件(WHERE uid=?),垂直越权靠路由级角色拦截。写完接口后,用另一个账号的 token 调一遍,是最好的自测习惯。