文章总结: 本文详细阐述了水平越权的定义、成因及危害,指出核心问题在于未校验数据归属。文章重点分析了参数篡改、批量接口、ID遍历等常见攻击场景,并结合PortSwigger靶场演示了具体检测方法,强调了对资源归属进行严格鉴权的重要性。 综合评分: 87 文章分类: WEB安全,渗透测试,漏洞分析
访问控制篇之水平越权
原创
一个努力的学渣 一个努力的学渣
一个努力的学渣
2026年3月6日 11:03 北京
免责声明
本文只做学术研究使用,不可对真实未授权网站使用,如若非法他用,与平台和本文作者无关,需自行负责!
定义
- 水平越权 (Horizontal Privilege Escalation),又称同级别越权或平行越权,指同一权限层级的用户,通过非法手段访问或操作其他同级别用户的资源,而无需提升自身权限等级。
- 核心点: 未校验数据归属(这数据是不是你的)
为什么会出现水平越权
-
水平越权的核心问题:服务器端在接收请求后,未能有效验证发起请求的用户是否有权访问他所指定的资源
-
具体来说,通常有以下几点原因:
-
仅依赖客户端参数进行权限判断:
-
这是最常见的原因。应用程序将用户身份或资源标识符(如用户ID、订单号、手机号、文件名等)直接暴露在客户端请求中(如URL、POST请求体、Cookie中),而服务器端仅仅依靠这些参数来定位和返回数据,却没有验证这些参数是否属于当前登录的用户
-
缺乏统一的访问控制层:应用程序的每个功能点都各自实现权限检查,但没有一个统一、标准的检查机制。这可能导致开发者在某些功能点遗漏了检查
-
可预测的资源标识符:使用的ID或标识符是简单、连续、可猜测的数字(如1,2,3,4…)。这使得攻击者很容易遍历这些ID,批量获取其他用户的数据
-
业务逻辑复杂导致的疏忽:在多步骤操作或复杂的业务流程中,开发者可能只验证了第一步的权限,后续步骤则完全信任客户端传来的数据,从而产生漏洞。
常见的攻击场景
参数篡改型水平越权(最常见,占比 90%)
-
核心原理:后端完全信任前端传入的资源 ID(user_id/order_id/file_id),不校验该资源是否属于当前登录用户,攻击者只需修改 ID 即可越权
-
技术实现:
-
URL 参数篡改(最简单)
正常请求(查看自己信息):http://demo.com/user/profile?user_id=1001攻击者篡改 ID:http://demo.com/user/profile?user_id=1002后端直接返回user_id=1002的信息 → 水平越权
- POST / JSON 请求体篡改
查询个人订单接口:// 正常请求{ "order_id": 8888}
篡改为他人订单 ID:{ "order_id": 9999}可直接查看他人订单、收货信息、手机号
- HTTP请求头篡改
部分系统将用户 / 资源标识放在请求头:# 原请求头X-User-ID: 1001X-Order-ID: 8888
篡改为他人标识即可越权
-
漏洞根源:
-
仅通过前端传入 ID查询数据
-
无「当前用户 ID」与「资源所有者 ID」校验
批量接口水平越权(危害最大)
- 核心原理:系统提供批量查询 / 导出 / 操作接口,但未对批量 ID 逐一做归属校验,攻击者可一次性获取大量他人数据
- 技术实现:
批量查询个人订单接口:{ "order_ids": [1001, 1002]}攻击者批量传入他人订单 ID:{ "order_ids": [1001, 1002, 1003, 1004, 1005]}
后端无校验,直接返回所有订单数据 → 批量越权
-
常见高危场景:
-
批量导出个人记录
-
批量查看文件 / 附件
-
批量删除 / 修改数据
-
漏洞根源:
-
批量接口只校验登录,不校验每个资源的归属
-
未限制批量请求数量
ID 遍历型水平越权
- 核心原理:资源 ID 使用连续自增数字(1、2、3…),攻击者通过遍历 ID,可扒取全系统同权限用户数据
- 技术实现:
用户 ID 为自增:http://demo.com/user/info?user_id=1http://demo.com/user/info?user_id=2http://demo.com/user/info?user_id=3...
攻击者编写脚本遍历 ID,可获取所有用户隐私数据
-
漏洞根源:
-
使用可预测的连续自增 ID
-
无资源归属校验 + 无接口访问限流
资源间接访问越权(文件 / 附件 / 分享)
-
核心原理: 针对私有文件、附件、图片、分享内容等资源,后端仅校验资源 ID,不校验是否为当前用户上传 / 拥有
-
技术实现:
-
文件下载越权:
正常下载自己的文件:http://demo.com/file/download?file_id=567篡改file_id下载他人私有文件:http://demo.com/file/download?file_id=568
-
图片/附件越权: 聊天图片、工单附件、个人证件照,修改资源 ID 即可查看
-
漏洞根源: 文件 / 附件只做 ID 校验,无用户归属判断
业务逻辑缺陷型水平越权
-
核心原理: 密码重置、信息修改、设备解绑等敏感业务接口,只校验表面参数,不校验「操作人与资源的归属关系」
-
技术实现:
-
密码重置越权, 攻击者可重置任意同权限用户密码
接口仅校验手机号 / 邮箱,不校验当前用户:http://demo.com/user/resetPwd?phone=13811111111
- 个人信息修改越权
修改资料接口,可直接传入他人user_id修改数据:{ "user_id": 1002, "nickname": "恶意篡改"}
- 漏洞根源: 业务逻辑只校验参数合法性,忽略身份归属
会话混淆 / 状态错乱越权
-
核心原理: 后端会话与用户绑定不严谨,并发请求、接口缓存、上下文错乱时,将 A 用户数据返回给 B 用户
-
技术实现:
-
多用户并发请求同一接口
-
接口未隔离用户会话,返回他人数据
-
缓存未按用户隔离,导致数据越权展示
-
漏洞根源: 会话、缓存、数据库查询未强制绑定当前用户 ID
漏洞危害
水平越权的危害程度取决于被访问的数据和可执行的操作
- 信息泄露:查看其他用户的个人资料、订单详情、地址、手机号、聊天记录、医疗档案等隐私信息。
- 数据篡改:修改其他用户的资料、删除他人的评论、取消他人的订单、修改他人购物车等。
- 业务操纵:例如,在电商平台,攻击者可能将优惠券转移到自己账户;在社交平台,可能以他人名义发送消息。
- 账户接管:如果通过水平越权能够修改他人的密码或绑定邮箱/手机,那么就可能直接导致账户被完全控制。这是危害最大的情况。
靶场
https://portswigger.net/web-security/all-labs#access-control-vulnerabilities
实验一:用户ID由请求参数控制
测试:直接修改用户名
之后抓包
实验二:用户ID由请求参数控制,用户ID不可预测
测试:ID不可控,翻找其他页面,查看数据包是否存在其他ID
尝试翻找其他页面,是否存在ID
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:一个努力的学渣 一个努力的学渣 一个努力的学渣《访问控制篇之水平越权》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论