☰
零基础入门越权漏洞:水平越权与垂直越权实战解析
2026/10/20 23:36:56 网站建设 项目流程

在Web安全的日常测试里,SQL注入、XSS这类漏洞被盯得很紧,但有一种逻辑型漏洞经常被低估,那就是越权漏洞。它没什么炫酷的命令行操作,却能让普通用户看到别人的订单、修改别人的资料,甚至以管理员身份发起删除操作。我最早接触它是在一次授权渗透测试里,当时只靠替换URL里的一串数字ID,就拿到了另一个账号的全部订单信息,危害之大、操作之简单,让我印象很深。越权漏洞的挖掘非常适合网络安全零基础的朋友入手,你不需要会写复杂脚本,只需要理解HTTP请求结构、身份认证机制和对象归属关系,再用浏览器加抓包工具,就能发现大部分问题。这篇文章我用三个已经脱敏处理的实战案例,拆解最常见的水平越权、垂直越权和IDOR绕过三类场景,讲清楚漏洞长什么样、为什么会出现、怎么验证、怎么修复,整套流程能直接拿来当实战教程用。

1. 越权漏洞的本质认知与分类

1.1 水平越权与垂直越权:一次类比讲透

越权漏洞可以简单分成两类:水平越权和垂直越权。

水平越权,是同一权限级别的用户之间,能够互相访问彼此的私有资源。比如A用户点开订单详情,结果看到了B用户的订单,A和B都是普通用户,权限级别没有差别。

垂直越权,是低权限用户拿到了高权限功能。比如普通员工调用了管理员的用户管理接口,直接拉取全部用户数据。

用一个公司门禁卡来类比就很好懂。普通员工的卡能刷开自己工位的门,结果A员工的卡不小心刷开了B员工的储物柜,两个人级别相同,这就是水平越权。普通员工的卡刷开了经理办公室的门,级别往上跨了一档,这就是垂直越权。门禁系统犯的错,要么是只验证了“卡是否能进这扇门”,却没验证“这张卡的主人是不是这扇门的归属人”,要么是把管理间的权限错误配给了普通卡。

放到Web系统里,大部分越权的核心场景就是:后端只拿前端传过来的user_id去数据库里查“属于这个ID的数据”,却没有拿当前会话里的真实身份去做比对。大家熟知的很多数据泄露事件,其实不是碰库碰出来的,而是这种越权接口把所有数据“按需”送到了攻击者面前。

1.2 越权产生的三个典型根源

我挖过不少越权漏洞,总结下来,根子基本跑不出以下三条。

后端过度信任前端参数。很多接口在设计时,为了方便联调,直接用请求里的id、uid、user_id这类字段去定位数据。本来这个字段应该由服务端根据登录态生成,结果却让前端决定。那前端传什么,后端就查什么,自然可以随便改成别人的ID。

对象归属校验缺失。这是最普遍的原因。很多接口只做了“登录校验”,没做“权限校验”。服务端确认了“你是登录用户”,却没确认“这条数据属于你”。于是任何登录用户只要改一下自己的资源ID,就能拿到别人数据。查询订单、查询简历、读取文件、查看收藏,凡是“根据ID查数据”的接口,都有可能踩中。

权限判断只放在前端菜单。管理员按钮在菜单里隐藏,普通用户看不到入口,但后端接口仍然存在。有些开发觉得“入口藏起来就安全了”,结果只要有人会抓包,直接构造请求就能访问。后端如果没有统一的鉴权中间件压住,这种垂直越权就是必然事件。

这三条经常叠加出现。一个系统如果占了两条,那越权基本就是板上钉钉的事。理解根源比记漏洞名称重要,因为只有知道漏洞是怎么产生的,测试时才知道该往哪个方向盯。

1.3 为什么越权漏洞适合零基础入门

越权漏洞本质上是业务逻辑问题,不像二进制漏洞要啃汇编,也不需要先精通各种语法规则。你只需要会看HTTP请求、会改参数、会对比响应,就能完成大部分测试工作。

相比SQL注入要先懂数据库语法,XSS要研究过滤绕过,越权的入门曲线对新人是相当友好的。而且越权在厂商漏洞奖励计划中属于高频的“中危/高危”漏洞,实战价值很高。如果你刚接触Web安全,把越权作为第一个深入钻研的方向,绝对不亏。它能最快帮你建立“身份与资源对应关系”的思维模型,这个模型后续用到权限绕过、支付逻辑、接口安全上,全都通用。

2. 挖掘前的准备工作:零基础也能上手的思路与工具箱

2.1 零基础先补哪些HTTP基础

在动手抓包之前,得先弄明白一次HTTP请求到底包含什么。不要被“HTTP协议”四个字吓到,你暂时不需要懂TCP握手、不需要懂三次挥手,只需要知道:

  • 请求方法:最常见的是GET和POST。GET一般用于查询,参数拼在URL里;POST一般用于提交,参数放在请求体里。
  • URL的组成:协议、域名、路径、查询参数。例如https://xxx.com/api/order/detail?orderNo=20240803001,其中orderNo=20240803001就是查询参数。
  • 请求头:Cookie、Authorization、Referer、Content-Type。登录后的身份标识往往藏在Cookie或Authorization头里。
  • 请求体:表单参数或JSON内容。很多接口把用户ID放在POST body里,容易被忽略。

想快速上手,可以打开浏览器开发者工具,切到Network面板,登录一个本地靶场或你有权限的测试系统,挨个点功能然后看请求。一个个请求对应页面上的点击动作,看多了你自然会有直觉:哪个接口带用户ID,哪个接口是用来查订单详情的。

特别注意登录后的身份标识。有些系统用Cookie里的session_id,有些用Authorization头里的token。后端靠它判断“你是谁”。越权漏洞的本质,就是让后端在“你是谁”和“你访问谁的资源”这两件事之间产生错位。

2.2 抓包改包工具怎么选、怎么配

工具不必贪多,两样就够。

浏览器开发者工具,最轻量,适合日常快速查看请求和响应,但改包不方便。

抓包拦截工具,比如Burp Suite,这是做Web安全测试的主力。免费社区版完全够用于越权挖掘。它本质上是一个本地代理,浏览器流量先经过它,再转发到目标服务器,所以你能看到、修改、重放每一个HTTP请求。

新手最容易卡在配置上,我把关键步骤说一下:

  1. 打开Burp,默认监听地址是127.0.0.1:8080。
  2. 在浏览器里设置代理指向这个地址,建议用代理扩展一键切换。
  3. 抓取HTTPS流量需要安装Burp的CA证书,证书装好之前只能看到加密的乱码,装好之后才能看到明文请求头、Cookie和Body。
  4. 抓到目标请求后,右键发送到Repeater,就能反复修改参数并观察响应。

配置过程中如果发现浏览器打不开HTTPS页面,八成是证书没装好,往回检查证书安装这一步就行。工具配好后,差不多所有越权测试的常规动作都能完成。

2.3 三步探测法:身份标识替换

越权测试不是漫无目的地乱试,我自己常用一套三步探测法,结构化、可复现。

第一步:枚举带身份或资源标识的入口。登录账号A,浏览所有功能,凡是URL里带数字ID、UUID、user_id等参数的请求全部记下来;POST body里不要漏,有些ID藏在JSON里。这一步的目标是找出所有“根据某个标识去查数据或操作数据”的接口。

第二步:替换成别人的标识重放。准备账号B,把请求里A的资源ID替换成B的资源ID。这个ID可以来自B的某个真实订单号、文件ID、用户编号,只要能拿到一个合法值就行。发送后对比响应。

第三步:判断差异与影响。如果响应里出现了A不应该看到的数据,比如B的订单、B的资料,说明后端没有校验资源归属。垂直越权则是在A的权限前提下,直接访问高权限接口,观察返回结果是否有效。

这套方法覆盖了绝大多数越权场景。测试过程中始终记住一个原则:只做只读验证,不发破坏性操作。越权漏洞的存在性,靠一次读请求就能证明,没必要真的去删别人数据。

3. 实战案例一:水平越权之订单遍历

3.1 发现过程:一个可预测的订单号

先还原一个模拟项目X里的场景,是一个电商小程序。登录账号A后,点开自己某一笔订单,Burp拦截到这样一个请求:

GET /api/order/detail?orderNo=20240803001

请求参数里的orderNo引起了我的注意。它不是随机字符串,而是“日期+三位序号”的结构:20240803代表日期,001代表当天第一笔。这种可预测的订单号在业务系统里非常常见,尤其使用了自增主键或者简单序号生成规则的场景。

看到这种结构,第一反应就是换号。把001改成002,在Repeater里发送。结果响应返回的不是A的订单,而是另一个账号的收货人姓名、手机号和完整家庭住址。再换003,照样返回别人的数据。

也就是说,只要把订单号末尾的三位序号遍历一遍,就能把所有订单全量拖走。所以做测试时,一旦发现资源标识具备可预测性,就不需要复杂的绕过手段,直接枚举就是最高效的方式。

为什么后端会犯这个错?多半是查询接口只做了“登录校验”,然后拿orderNo直接去订单表里查数据,完全没做“orderNo对应的订单是否属于当前登录用户”的二次过滤。开发时可能觉得前端只会展示自己的订单号,用户不会去改这个数字,结果任何人都能改。

3.2 复现与验证细节

复现的过程看起来简单,但有几个细节没处理好会漏判。

首先是重放前的准备工作。先复制一份原始请求,记录原始响应。修改orderNo后发送,观察响应体。

很多人只看状态码,觉得返回200就是成功。实际上很多系统越权后照样返回200,只是data字段为空,或者错误码不同。所以一定要看响应体的完整内容,特别关注名字、手机号、地址这种业务字段是否变化。

其次是验证只读即可。我一般只做“详情”接口的读请求,证明能读到别人数据就足够了。不要顺手去调修改地址、申请退款的接口做破坏性演练,把测试请求留在对方数据库里,不好收场。

还有一个坑是缓存干扰。有时候换了ID,却发现响应和之前一模一样,这不一定是越权,可能是浏览器缓存或CDN缓存。解决办法是在请求URL后加一个随机参数,比如&_t=123456,绕过缓存后再对比。如果加了随机参数后响应变了,才能确认是越权。

最后是记录证据。改包前后的请求和响应对比截图,是漏洞报告的核心附件。截图上一定要能看清改动了哪里、响应里泄露了哪些数据。

3.3 修复思路与防护建议

这个案例的修复方案,核心就一句话:后端从Session或Token中取当前用户ID,而不是从前端参数取。

具体来说:

  • 查询订单前,先校验订单的owner等于当前会话中的用户ID。
  • 订单号不要用可预测的自增数字,可以用随机字符串或UUID,即便被别人拿到,也无法批量枚举。
  • 敏感字段做脱敏处理,比如手机号中间四位打码,地址只显示省市区,降低泄露后的实际危害。

归属校验是整个越权修复的关键。建议封装成公共的权限校验函数,所有涉及资源访问的接口统一调用,而不是每个接口自己写一遍,否则下一个新接口又会漏掉。安全这东西,最怕的是“每个开发都觉得自己把权限写了”,结果谁都没写全。

4. 实战案例二:垂直越权之后台接口裸奔

4.1 现场情况:前端藏了入口但接口还在

再看一个后台管理系统的案例。这个系统有一个普通员工账号和一个管理员账号。普通员工登录后,左侧菜单只有“我的工单”“个人信息”,看不到任何管理入口。

但我在分析前端JS代码和接口文档时,发现后台服务里存在一个接口:GET /api/admin/user/list。于是我用普通员工账号登录,保持自己的Cookie和Authorization不变,直接把请求地址改成这个接口。发送后,接口返回了全量用户列表,里面有所有员工的手机号、部门、角色权限。

这是很典型的垂直越权。开发犯的错,是用前端菜单控制权限:菜单隐藏,就觉得功能安全了。但前端隐藏只是不让普通用户看到入口,后端接口没有任何角色校验。你只要会手工构造URL,就能直接访问。

这种场景在线下渗透测试和线上漏洞奖励计划里都非常常见。很多后台系统的“权限控制”实际是“入口控制”,而入口控制只能防小白,防不了会抓包的人。

4.2 两种绕过姿势:直连接口与角色参数篡改

垂直越权有两种常见姿势,建议按顺序测。

第一种:直连接口。用低权限账号登录,保持身份凭证不变,直接把请求行改成高权限接口地址,发送。如果返回了本该管理员可见的数据,垂直越权成立。这类问题的根源是后端没有区分“普通用户使用的接口”和“管理员使用的接口”,只要登录态有效就放行。

第二种:角色参数篡改。有些系统会把角色信息放在请求参数里。比如用户信息接口返回"role":"user",管理员接口则要求请求里带"role":"admin";或者用了一个自定义Header,比如X-User-Role: user。把这些字段改成admin或者加一个X-Admin: true,再看接口响应有没有变化。

为什么参数篡改能生效?因为后端从请求里读取角色,而不是从服务端会话或Token中解析。信任前端传参,等于把权限开关交到了调用者手里。如果第一种直连接口被网关挡住了,第二种参数篡改常常能绕过;如果网关也校验了角色,那就说明后端至少做了统一鉴权,这时候可以用权限翻倍、越权组合等方式继续测试。

4.3 影响评估与修复

垂直越权的影响非常大。普通员工能拉取全量用户手机号、导出资料,如果接口还支持用户修改、删除操作,那就等于普通账号瞬间升级成管理员。

修复时要从架构层面堵住:

  • 统一在网关或框架拦截层做权限校验,对管理路径下的接口按角色做合法性校验。
  • 角色必须来自服务端会话或JWT解析的结果,不能信任前端传来的role字段。
  • 写自动化接口测试用例,普通角色访问高权限接口应返回401或403。
  • 定期做后端接口盘点,检查新增接口是否遗漏权限注解。

垂直越权尤其考验一个团队的安全规范意识。接口一多,就容易有人忘了加鉴权。所以统一的风险控制中间件比逐个接口补权限要靠谱得多。

5. 实战案例三:IDOR进阶——UUID也不是免死金牌

5.1 从其他接口泄露的UUID

IDOR的全称是Insecure Direct Object Reference,直译过来是“不安全的直接对象引用”。简单说,你自己的资源就是一个“直接对象”,引用它的方式可能是数字ID、UUID、文件名,甚至一个分享链接。

很多初学者有一种误解:只要把数字ID换成UUID,就安全了。因为UUID没法枚举,攻击者猜不到。但现实是,UUID虽然猜不到,却可能从其他渠道泄露。

第三个案例是一个网盘类测试系统。用户登录后,通过GET /api/v1/files/{fileId}读取自己的文件,fileId是UUID。单独看这个接口,没什么问题,文件ID不可枚举,好像挺安全。

但系统里有一个普通用户能访问的通知接口,会返回系统公告列表,而公告的附件链接里带着管理员上传文件的UUID。普通用户点开这个附件链接,请求路径走的就是/api/v1/files/{fileId}。如果后端只校验了登录态、没校验文件属主,那么这个普通用户就能下载管理员附件。

这个案例说明几个问题:第一,UUID不可枚举,但可能通过分享链接、公告、客户反馈、导出报表等被动场景泄露;第二,后端收到一个合法文件ID后,必须校验这个文件是否属于当前用户;第三,越是看起来复杂的对象引用,越要专门设计鉴权逻辑。

5.2 批量ID与并发竞争的另类思路

除了利用被动泄露的UUID,越权测试还有两种容易漏掉的思路。

批量参数绕过。有些接口为了提升性能,支持一次查询多个对象,比如GET /api/user/info?ids=1,2,3,或者POST body里传一个ID数组。如果后端只做了登录校验,没有对数组里的每个ID逐个做归属校验,一次请求就能返回大量用户数据。这类接口比单ID接口风险更大,因为泄露面成倍放大。

测试时,我会构造一个包含当前账号ID和另一个账号ID的请求,观察响应里是否出现了另一个账号的数据。如果出现,说明批量查询接口对每个ID都没有做归属校验。

并发条件竞争。越权不一定只出现在“静态数据读取”阶段,还可能出现于“状态转换过程”。比如一个修改订单流程:先检查订单是否属于当前用户,检查通过后再修改。如果两个请求几乎同时到达,第一个请求通过了检查,第二个请求到达时检查逻辑已经被并发绕过,也跟着完成了修改,两个请求都返回成功。这种情况叫TOCTOU,也就是检查时间与使用时间之间存在竞态。

用Burp的并发发送功能或者自己写并发脚本可以验证。并发竞争是越权里比较进阶的方向,新手不需要一开始就硬啃,但要知道存在这个可能,不然真遇到了容易一头雾水。

5.3 检验与加固要点

针对IDOR类漏洞,检验标准其实很清晰:任何对象引用都不能直接作为数据访问依据,必须和当前用户绑定。

  • 如果业务上允许共享资源,那共享关系必须有独立的授权记录,不能默认允许所有人访问。
  • 所有涉及资源访问的接口,自动化测试至少覆盖一条用例:普通用户访问他人资源时返回403或404。
  • 修复时有个小技巧:把越权访问的返回码设计成404而不是403,让攻击者无法分辨资源到底存不存在。不过这只是缓解手段,根子上还是得做归属校验。

IDOR这个名称听起来不如“注入”“上传”那么唬人,但它引起的危害和数据泄露案例一点都不小。理解这一点,比记住名词更重要。

6. 常见问题与排查技巧实录

6.1 合法合规边界:先做授权再动手

越权测试特别容易踩到合规红线,因为它本质上就是“访问别人的数据”。所以必须在动手之前把边界划清楚。

  • 只测你自己有授权的系统:公司委托的测试、厂商漏洞奖励计划明确授权的资产、自己搭的靶机。
  • 没有授权的情况下,哪怕只是浏览接口、发一个探测包,也可能违法。
  • 测试过程中,不要真的下载或导出大量他人敏感数据。验证“能读到”就停,截图留证据即可。
  • 不要用修改、删除这类破坏性请求去证明漏洞,影响面写得再大,也不如一次只读请求的复现证据干净。

我见过不少新人,学会抓包就到处拿别人的网站练手,踩线了还不自知。明明有一身技术潜力,却因为边界问题耽误了自己。越权测试尤其容易越界,因为你每天都在“看别人数据”。控制住验证深度,才是既体现水平又站得住脚的做法。

6.2 测试中容易踩的五个坑

这些年挖越权,我自己踩过不少坑,挑印象最深的五个说一下。

第一个坑:只看状态码,不看响应体。有些系统越权后返回200但data为空;有些返回200但错误码不同;还有些直接返回了整个对象。一切要以响应体内容为准。判断越权是否成功,不是看请求是否“成功”,而是看返回的数据是否越权。

第二个坑:测试账号没建好。水平越权至少要准备A、B两个账号,且两个账号的数据要能明显区分。否则你换号后拿到一份数据,根本分不清是A的还是B的,复现报告就没法写。

第三个坑:只盯URL里的ID。ID可能藏在URL路径、查询参数、POST表单、JSON Body、Cookie甚至自定义Header里。改包时把所有可能的位置都过一遍,不要只盯着浏览器地址栏。

第四个坑:被缓存骗了。换了ID后响应不变,可能是缓存。加一个随机参数绕开缓存再做判断,免得把缓存当越权,或者把越权当缓存。

第五个坑:做了破坏性操作。用删除、禁用接口去证明越权,会让测试环境变脏,还会打草惊蛇。越权验证用读接口就够了,破坏性操作的影响可以在报告里说明,但真没必要在测试时执行。

6.3 越权挖掘技巧速查表

我平时习惯把常见场景整理成一张速查表,测试前先过一遍。

漏洞类型关注入口验证方法高危信号
水平越权带资源标识的URL、请求体将ID替换成另一用户的ID后重放响应返回他人私有数据
垂直越权管理接口路径、角色参数低权限用户直连高权限接口返回管理数据或操作成功
IDORUUID、分享链接、文件引用使用他人对象引用访问资源非授权资源被读取
TOCTOU状态修改类接口并发发送两个变更请求两个变更请求都返回成功

这张表不是花架子,是我每次测试都会对照的检查清单。照做一轮,能覆盖80%以上的越权漏洞。剩下的那些更复杂的场景,往往也是在这些基础思路上加了些业务层包装而已。

我自己刚开始挖越权时,最容易犯的错就是不看响应体,只盯着状态码,结果漏掉了已经触发的越权;后来养成习惯,所有验证只做只读操作,请求和响应前后对比留好截图,测试完确认数据没被动过。越权是入门和进阶性价比都很高的方向,一旦你熟悉了这套“身份标识替换—响应差异对比—权限链路梳理”的方法,以后遇到任何系统,都会本能地翻一翻那些带id参数和UUID地址的接口。如果还想继续深入,可以再研究越权与其他漏洞的组合利用,比如通过越权读取到的敏感信息配合钓鱼思路形成完整的利用链,或者用越权接口改写业务配置来放大影响。先把这几个基础案例做实,后面的路会顺很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询