尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

逻辑漏洞之越权访问原理、检测与防御全解析

逻辑漏洞之越权访问原理、检测与防御全解析 一、漏洞原理与本质越权访问是逻辑漏洞中最常见、危害也最大的一类。攻击者通过修改请求中的用户标识、资源 ID 等参数访问或操作本不属于自己权限范围内的数据或功能比如查看别人的订单、修改别人的信息、删除别人的文章、使用管理员功能等。越权漏洞本质是服务端没有对当前用户的权限进行严格校验过于相信客户端传来的参数导致权限控制失效。越权漏洞虽然不像 SQL 注入、命令注入那样技术含量高但在实际业务系统中非常普遍而且危害往往很直接直接导致数据泄露、数据篡改、业务混乱。很多系统花了大力气防 SQL 注入、防 XSS结果一个简单的越权漏洞就把所有数据泄露了。越权漏洞也是等保测评、安全审计中必查的项目是业务安全的核心风险点之一。越权漏洞产生的根本原因服务端只验证了用户是否登录没有验证用户是否有权限操作当前请求的资源。开发者觉得用户已经登录了就是合法用户但登录不代表有权限操作所有数据。每个用户只能操作自己的数据管理员才能操作管理员功能这些权限校验必须在服务端做不能靠前端隐藏按钮、靠客户端传参来控制。二、越权漏洞的分类根据越权的方向和范围越权漏洞可以分为以下几类1. 水平越权平行越权相同权限级别的用户之间可以互相访问对方的数据。比如普通用户 A 可以查看普通用户 B 的个人信息、订单、消息等。水平越权是最常见的越权类型也是最容易被忽视的很多开发者觉得都是普通用户看一下也没什么但实际上用户的个人信息、订单数据、聊天记录等都属于敏感数据未经授权访问就是严重的安全问题。2. 垂直越权权限提升低权限用户可以访问高权限用户的功能或数据。比如普通用户可以访问管理员后台、执行管理员操作、查看管理员才能看的数据。垂直越权的危害通常比水平越权更大因为攻击者可以获得更高的权限做更多破坏性操作。最极端的垂直越权就是未授权访问连登录都不需要直接就能访问需要登录的功能。3. 交叉越权同时存在水平越权和垂直越权比如普通用户既可以看其他普通用户的数据也能访问部分管理员功能。从操作类型来看越权又可以分为- 越权查询查看别人的数据如查看他人订单、个人信息- 越权修改修改别人的数据如修改他人密码、个人资料- 越权删除删除别人的数据如删除他人文章、评论- 越权新增以别人的身份新增数据如用别人的账号下单- 越权操作执行别人才能执行的操作如用管理员权限添加用户三、越权漏洞常见出现场景越权漏洞几乎存在于所有有用户系统、有数据权限的 Web 应用中常见场景包括- 用户中心查看/修改个人信息、修改密码、查看订单、查看消息等参数中带user_id、uid、id 等用户标识的地方- 内容管理文章、帖子、评论、图片等内容的查看、修改、删除参数中带article_id、post_id、comment_id 等资源 ID 的地方- 订单系统查看订单详情、取消订单、申请退款等参数中带 order_id 的地方- 后台管理各种管理员功能通过修改 URL 或参数直接访问- 文件下载下载文件时参数中带文件 ID 或路径可能越权下载别人的文件或敏感文件- API 接口RESTful API 中通过 ID 访问资源如果没有权限校验很容易出现越权- 功能开关某些功能只对特定用户开放如果只靠前端隐藏按钮后端不校验就会被越权使用四、越权漏洞常见利用方式1. 修改 ID 参数最直接的方式把请求中的 user_id、order_id、article_id 等参数改成其他值看能不能访问或操作对应的数据。比如把自己的 user_id1 改成user_id2看能不能看到用户 2 的信息。2. 遍历 ID如果 ID 是连续的数字可以用 Burp 的 intruder 功能批量遍历 ID批量获取所有用户的数据。很多系统的用户 ID、订单 ID 都是自增的很容易被遍历。3. 修改角色/权限参数有些系统把用户角色、权限等级存在前端参数或 Cookie中攻击者可以直接修改这些参数把自己改成管理员角色。比如 Cookie 中 roleuser改成 roleadmin就能获得管理员权限这是非常低级但确实存在的错误。4. 猜测管理员路径很多后台管理的路径有规律比如/admin、/manage、/system、/backend 等攻击者可以通过字典猜测后台路径直接访问管理员页面。5. 绕过前端限制有些系统只在前端隐藏了按钮或菜单后端接口没有权限校验攻击者可以直接构造请求调用后端接口绕过前端限制。6. 利用接口文档/调试信息有些系统的接口文档、调试信息、错误信息中会泄露其他接口的 URL 和参数攻击者可以利用这些信息发现越权漏洞。7. 水平越权转垂直越权先通过水平越权获取其他用户的信息再通过其他用户的信息比如管理员的密码、Token实现垂直越权。五、越权漏洞完整防御方案防御越权漏洞的核心思想很简单每一个需要权限的请求服务端都必须校验当前用户是否有权限操作目标资源。说起来简单但真正做好并不容易需要从架构、开发、测试多个层面共同保障。1. 统一权限校验框架最关键不要每个接口自己写权限校验很容易漏。使用统一的权限框架如 Spring Security、Shiro、Casbin 等在框架层面统一做权限校验所有请求都要经过权限校验才能执行业务逻辑。这样可以从架构层面避免遗漏。2. 基于用户身份查询数据查询数据时不要只靠前端传过来的 ID还要加上当前登录用户的 ID 作为查询条件。比如查询订单详情SQL 应该是select * from orderwhere id? and user_id?而不是只查where id?。这样即使用户篡改了订单ID也查不到别人的订单。3. 资源操作前校验归属修改、删除、新增等操作在执行前必须校验当前用户是否是该资源的所有者或者是否有操作该资源的权限。不能因为传了 ID 就直接操作。4. 不要相信前端传的权限参数用户的角色、权限、身份等信息必须从服务端的Session、Token 中获取绝对不能相信客户端传过来的参数。Cookie、请求参数中的角色、权限信息都可以被篡改不能作为权限判断的依据。5. 后台接口独立鉴权管理员后台的所有接口必须单独做管理员权限校验不能和普通用户共用一套鉴权逻辑。后台路径不要太简单可以加随机前缀增加猜测难度但这只是辅助核心还是后端权限校验。6. 避免 ID 可预测用户 ID、订单 ID 等如果是连续自增的很容易被遍历。可以用 UUID、雪花算法等生成不可预测的 ID增加遍历难度但这也只是辅助不能代替权限校验。7. 统一错误返回越权访问时统一返回无权限或资源不存在不要返回资源存在但你没权限防止攻击者通过错误信息判断哪些 ID 是有效的。8. 安全测试与代码审计开发完成后必须做越权测试用不同权限的账号互相访问看是否存在越权。代码审计时重点检查权限校验逻辑是否完整、是否每个需要权限的接口都做了校验。六、常见防御误区只在前端隐藏按钮前端隐藏没用攻击者可以直接调用后端接口只验证是否登录不验证是否有权限登录不等于有权限每个资源操作都要校验归属相信前端传的用户 ID前端传的任何参数都可能被篡改用户身份必须从服务端Session/Token 取觉得 ID 是 UUID 就不会被越权UUID 只是难猜一旦通过其他方式泄露了别人的 ID照样可以越权只查不验查询时加了用户 ID 条件但修改删除时没加一样会有越权觉得内部系统就不用做权限校验内部系统也有不同角色、不同部门一样需要权限控制七、漏洞检测方法越权漏洞的检测思路很简单用不同账号互相访问对方的资源看是否能成功。具体步骤1. 准备测试账号至少两个普通用户账号测试水平越权再加一个管理员账号测试垂直越权2. 用用户 A 登录抓取所有业务接口的请求记录每个请求的参数和返回结果3. 把请求中的用户标识、资源 ID 等参数改成用户 B 的用用户 A 的Cookie/Token 重新发送请求4. 看返回结果如果能正常返回用户 B 的数据说明存在水平越权5. 同样的方法测试管理员接口用普通用户账号访问管理员功能看是否能成功垂直越权6. 测试所有增删改查接口不要只测查询接口7. 注意无回显的越权有些操作没有返回结果但实际执行了要通过其他方式验证比如查询确认。越权漏洞的检测比较依赖人工自动化扫描工具不太容易发现因为工具不知道哪些数据属于哪个用户。所以越权测试是渗透测试中人工测试的重点项也是最容易发现问题的地方。
返回列表