越权访问漏洞原理

一 漏洞描述

越权访问漏洞在2021年是被OWASP列为Web应用十大安全隐患的第一名。可见这个漏洞在我们的日常生活比较常见。

二 漏洞分类

越权访问漏洞具体来分可以分为2类:水平越权 和 垂直越权。我们来详细介绍一下这两种越权方式的不同。

1  水平越权

相同级别的同一用户或者同一角色的不同用户,可以越权访问,修改或者删除其他用户信息的非法操作。

2 垂直越权

不同级别之间的用户或者不同角色之间的用户之间的越权,比如普通用户可以执行管理员执行的功能。

三 漏洞原理(产生原因)

  1. 隐藏的url实现权限管理   


    实现控制访问有些程序的管理员的管理页面只有管理员才显示,普通用户看不到,利用 URL 实现访问控制,但 URL 泄露或被恶意攻击者猜到后,这会导致越权攻击。
  2. 引用对象直接查看


    通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的 ID 号时会返回他人的信息,便产生了水平越权

  3. 多功能阶段  


    多阶段功能是一个功能有多个阶段的实现。例如修改密码,可能第一步是验证用户身份信息,号码验证码类的。当验证成功后,跳到第二步,输入新密码,很多程序会在这一步不再验证用户身份,导致恶意攻击者抓包直接修改参数值,导致可修改任意用户密码。

  4. 静态文件


    很多网站的下载功能,一些被下载的静态文件,例如 pdf、word、xls 等,可能只有付费用户或会员可下载,但当这些文件的 URL 地址泄露后,导致任何人可下载,如果知道 URL 命名规则,则会便利服务器的收费文档进行批量下载。

  5. 平台配置错误   


    一些程序会通过控件来限制用户的访问,例如后台地址,普通用户不属于管理员组,则不能访问。但当配置平台或配置控件错误时,就会出现越权访问。

四 修复建议(措施)

前后端同时对用户输入信息进行校验,双重验证机制

执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限

特别敏感操作可以让用户再次输入密码或其他的验证信息。

可以从用户的加密认证 cookie 中获取当前用户 id,防止攻击者对其修改。或在 session、cookie 中加入不可预测、不可猜解的 user 信息。

直接对象引用的加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理

永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤

五 思维导图

### 水平越权漏洞的原因及原理 水平越权漏洞(Horizontal Privilege Escalation)指的是同一权限等级内的不同用户之间发生的数据或功能访问超越了应有的边界。具体来说,当应用程序未能正确验证当前用户的标识符或其他唯一识别信息时,可能导致一个普通用户可以访问其他同级用户的敏感数据或执行不应被允许的操作[^3]。 #### 原因分析 1. **缺乏有效的身份验证机制** 如果系统仅依赖于前端传递的身份标识(如URL中的ID参数),而未在服务器端进行严格的校验,则容易受到攻击者的利用。例如,在查看订单详情页面时,如果只是简单地信任客户端提交的商品编号而不做进一步确认,那么恶意用户就可以轻易更改这个编号来窥探别人的订单情况[^4]。 2. **不安全的对象引用** 当程序设计人员假设某些对象引用(Object Reference, OR)是私密的或是难以猜测到的时候,实际上这些OR可能会暴露给未经授权的人士。比如文件路径、数据库记录索引等都属于此类潜在风险点。一旦这类信息泄露出去,并且服务端又缺少必要的防护措施的话,就会形成安全隐患[^1]。 3. **业务逻辑错误** 开发过程中可能存在一些疏忽之处,使得即使是在正常流程下也有可能触发越权行为。例如,在社交网络平台上实现好友间的消息发送功能时如果没有仔细考虑消息接收方的有效性和合法性判断条件,就可能让非朋友关系之间的用户互相通信,进而造成隐私侵犯等问题[^2]。 ```python # 不推荐的做法:直接使用未经验证的用户输入作为查询条件 def get_user_profile(user_id): profile = db.query(f"SELECT * FROM users WHERE id={user_id}") return profile # 推荐做法:加入额外的安全检查以防止横向越权 def secure_get_user_profile(current_user_id, target_user_id): if not is_friend_of(current_user_id, target_user_id): # 额外增加的好友关系验证 raise PermissionDeniedError() profile = db.query(f"SELECT public_info FROM users WHERE id={target_user_id}") # 只返回公开的信息字段 return profile ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值