
做渗透测试或者准备考CISP-PTE的朋友对“访问控制”这个知识域应该都不陌生。CISP-PTE全称是注册信息安全专业人员-渗透测试工程师实操考试模拟的是接近真实环境的Web渗透过程而访问控制往往是决定你能不能拿下一整条攻击链的关键环节。很多人复习到这里会觉得它不像SQL注入、XSS那样有各种现成payload看起来就是“校验逻辑”很容易被低估但恰恰是这个低估让不少人在考场上丢了分。这篇文章我结合自己的备考经历和项目里做过的大量越权测试把CISP-PTE访问控制的考察方式、底层原理、实操链路、工具选择、常见坑位一次讲透适合正在备考的伙伴也适合日常做授权渗透测试想补强越权思路的同行。1. 访问控制在CISP-PTE里到底考什么1.1 知识域分布与分值逻辑CISP-PTE考试分两大部分知识测试选择题和实操测试。实操题由多个独立任务场景组成每个场景对应一个或多个漏洞点。访问控制很少单独占一个大题而是作为Web安全综合场景里的隐藏得分点出现。甚至可以说它经常是串联整条攻击链的“最后一公里”。举个例子一个典型考试场景是“某系统存在多个漏洞请获取指定用户的数据”。做题路径往往是这样先通过SQL注入或者其他漏洞拿到一个低权限账号登录后发现某个查询接口存在水平越权通过遍历参数拿到目标用户的数据flag就藏在里面。如果你只会在SQL注入这一步停下来后面就白搭了。这提醒我们备考时不能把知识域割裂开访问控制恰恰是用来串联漏洞利用过程的核心环节。选择题部分也会考访问控制的基础概念比如自主访问控制DAC与强制访问控制MAC的区别、RBAC的角色层次、越权漏洞的成因等。这类题不难但需要把概念吃透。DAC是资源所有者自己决定授权典型代表是Linux的rwx权限MAC是系统级强制规则用户无法绕过典型代表是SELinux和BLP模型。考试会拿实际场景问你这属于哪种模型多做几道题就有感觉了。1.2 三种典型出题形态结合历年真题回忆和训练平台的情况访问控制题目基本逃不出三种形态水平越权A用户能操作B用户的资源。典型入口是带数字ID的接口比如 /getUserInfo?id102把102改成103、104如果返回的是别人的数据就是水平越权。垂直越权普通用户能执行管理员操作。典型入口是管理后台接口比如 /admin/delUser普通用户直接访问也能成功。未授权访问不需要登录就能访问本应受限的资源。典型入口是后台路径、日志文件、备份文件、接口文档。我看到很多人拿到题目第一反应是扫目录、上sqlmap其实访问控制类题目最该做的是“登录后观察请求”。先把正常业务流程的每个请求抓下来看清楚哪些接口带ID参数、哪些返回了敏感字段、哪些路径看起来像管理功能再决定动手方向。这一步不做好后面就是盲打效率极低。2. 访问控制的底层原理模型、校验与错位2.1 三个模型一张矩阵理解访问控制漏洞先要理解三种基础模型。DAC自主访问控制是最早也是最直观的一种资源所有者自己决定谁能访问而且权利还可以传递。Linux的文件权限、Windows的共享权限都是DAC的典型代表。这种模型灵活但安全性依赖所有者的判断力出了岔子就容易越权。MAC强制访问控制正好相反由系统统一制定规则所有主体和客体都有自己的安全标签用户和资源所有者都不能随意更改规则。它的典型代表是SELinux和BLP模型多用在政府和军事系统里安全性高但灵活性低。RBAC基于角色的访问控制是Web系统里最常见的设计思路把权限授予角色再把用户归入角色。管理员、编辑、普通用户就是不同的角色。这种模型的好处是权限管理清晰新用户只需要分配角色不需要单独配权限。还有一个广义的ABAC基于属性的控制根据用户属性、资源属性、环境条件动态决策适合复杂场景但目前Web应用落地较少考试里了解即可。2.2 用“酒店房卡”理解水平与垂直越权我讲课的时候习惯用酒店房卡打比方这个类比能帮人瞬间理解两类越权。房门磁卡本身是一套访问控制机制房卡能刷开自己的房门属于认证证明“我有资格进入”但是刷开房门之后如果拿着自己房间的卡去刷同楼层其他房间也能打开那就是水平越权系统只检查“卡是否有效”没检查“卡是不是这个房间的”如果普通住客卡能刷开所有房间甚至能进机房、布草间那就是垂直越权如果房门根本没锁谁都能推开那就是未授权访问。这个比喻也解释了同一个现象访问控制漏洞很难靠扫描器自动发现。扫描器知道“门没锁”但它很难判断“这张卡到底该不该开这扇门”。所以人工测试、业务理解、参数改动缺一不可。2.3 代码层面的错位点从代码上看越权的基本模式是“用参数里的身份标识去查数据而不校验当前会话身份”。比如下面这段典型的错误代码// 错误直接用前端传入的订单号查询 $order DB::find($_GET[order_id]); return json_encode($order);问题在于$_GET[order_id] 是用户可控的而查询没有附加条件“此订单必须属于当前登录用户”。// 正确先取当前登录用户再做归属校验 $user getCurrentUser(); $order DB::find($_GET[order_id]); if ($order-user_id ! $user-id) { return error(无权访问该订单); } return json_encode($order);这就是“身份与资源归属的匹配校验”。实战中校验缺失可能发生在列表接口、详情接口、修改接口、删除接口、下载接口……凡是能通过ID定位资源的都有可能中招。明白这个原理之后测试访问控制的核心动作就清晰了找一个正常的资源访问请求把它改成“别的资源”看服务端会不会拦。不拦就是漏洞要拦就换下一个点。3. 实操链路从信息收集到越权利用3.1 信息收集阶段的四个“权限入口”把CISP-PTE考试当成一次真正的渗透测试来做第一步永远是信息收集但侧重点要放在“权限相关线索”上。我总结为四个看。看接口路径带有 admin、manage、user、role、perm 等关键词的路径是垂直越权的高发区。比如 /api/v1/admin/config、/console/manage 这类地址往往就是管理入口。看请求参数数字ID、UUID、用户名、订单号凡是用户可控且能唯一定位资源的参数都是水平越权的候选对象。拿到一个请求就去问自己这个参数背后的数据是我的吗服务端校验了吗看响应与JS源码网页源码里注释掉的链接、隐藏按钮、JS文件里定义的接口列表经常暴露前端没展示但后端已经实现的功能。这些功能如果没做权限校验就是一个现成的越权入口。看认证信息Cookie里的字段、JWT的payload、Authorization头的格式。有时候权限标识就藏在里面比如JWT的role:user字段直接改成admin再重放就是一个经典测试动作。3.2 水平越权的标准操作流程水平越权测试最标准的流程是这样准备两个普通账号A和B。考试环境如果有注册功能就直接注册如果默认给了多个账号就用现成的。用A登录找到A能访问的资源比如订单列表记录A的资源ID范围。用B登录同样记录B的资源ID范围。用A的会话去请求B的资源ID比如把 /api/order/1001 改成 /api/order/1002。如果返回了B的订单数据包括姓名、手机号、地址那水平越权就确认了。实际操作时我用Burp Suite的Repeater完成第4步。改完ID后可能遇到几种情况返回200且响应内容变化漏洞确认接着遍历所有ID拿数据返回404可能ID不存在也可能是越权后触发了不存在逻辑换一个已知存在的ID再试返回401/403服务端有校验说明这个接口防护到位换下一个接口返回200但数据不变可能是缓存也可能是参数根本没被后端使用需要进一步分析。3.3 垂直越权的常用提权姿势垂直越权的核心思路是“让我的请求被当作管理员请求来处理”。常用姿势有修改请求体里的角色字段JSON里如果有role:user改成role:admin或role:administrator直接调用管理接口普通用户访问 /admin/delUser?id1如果返回成功说明接口没做角色校验替换HTTP方法有的系统对GET请求不做鉴权、对POST做鉴权或者反过来。把GET改成POST、PUT、DELETE看看响应有没有变化留意请求头依赖个别系统会根据来源判断请求是否可信测试时观察服务端对请求头变化的响应差异。这里要提醒相关测试必须在授权范围内进行不要越界使用任何未授权的技术手段路径构造/user/../admin 这类路径如果能被路由解析可能绕过前端路由限制但后端一般很少中招优先级可以放低。垂直越权的收益通常比水平越权大因为一旦拿到管理权限flag往往直接就在后台数据里。但垂直越权的门槛也更高经常需要先通过信息收集找到隐藏的管理接口否则连该调哪个接口都不知道。3.4 CISP-PTE考试能用什么工具怎么配很多人在备考阶段都会打听“CISP-PTE考试能用什么工具”。据我了解考试通常是在考场提供的虚拟机里完成的环境预装了常用的浏览器、Burp Suite、sqlmap等工具覆盖绝大多数Web渗透场景。备考时建议就用与考场接近的工具组合免得临场不熟悉。我个人推荐的最小组工具集Burp SuiteCommunity版足够抓包、改包、Repeater重放、Intruder遍历ID这是访问控制测试的核心工具浏览器加HACKBAR扩展快速构造和发送HTTP请求适合验证单个请求改动sqlmap遇到SQL注入时配合使用拿到数据后往往能接上访问控制链路目录扫描工具dirsearch或dirb用来发现隐藏管理后台和接口文档WebShell管理工具如果考试包含上传漏洞拿Shell的场景会用到只在授权考试靶机里使用。不建议依赖复杂自动化工具去做访问控制测试。越权判断需要理解业务和响应差异自动扫描器在这一块基本是废的。真正高效的做法来自对请求的仔细分析和对参数的批量尝试而不是靠工具一键扫描。4. 典型漏洞场景拆解与绕过技巧4.1 IDOR数字ID引发的灾难IDOR全称是Insecure Direct Object Reference不安全的直接对象引用是访问控制漏洞里最常见的一种。它指的是应用直接使用用户提供的对象标识符ID、文件名、账户号访问资源却不检查用户是否有权访问。实操中我遇到过一个典型的在线学习系统场景学员可以查看自己的购买记录请求是GET /api/myCourse?courseId305把courseId改成306、307、308结果返回了其他学员的购买记录里面有手机号、姓名、发票抬头信息。这就是教科书式的IDOR。测试IDOR有个细节容易被忽略不要只盯着数字ID。现在很多系统用UUIDUUID本身很难遍历但如果你能从另一个接口比如用户公开信息、列表接口拿到别人的UUID照样能越权访问。所以IDOR的判断标准不是“ID好不好猜”而是“服务端到底校验了归属没有”。4.2 未授权访问隐藏不等于保护有一部分开发者的安全观念停留在“入口藏起来就安全了”。他们把管理按钮隐藏、菜单折叠、接口路径设计得比较隐蔽以为这样普通用户就发现不了。但后端路由并没有做身份和角色校验谁都能直接访问。测试时可以准备一份“常见后台路径字典”包括/admin、/manage、/console/api/v1/admin、/api/manage/user/swagger-ui.html、/api-docs/backup、/test、/upload用目录扫描工具扫一遍然后对命中的路径做未登录直接访问。有些系统的Swagger接口文档本身就是信息泄露点里面把每个接口的参数和鉴权要求写得清清楚楚直接帮你省去逆向分析的工夫。需要说明的是未授权访问的判断标准很简单退出登录或者换一个未登录的浏览器访问目标路径如果拿到了数据那就是未授权访问。不是“任何路径都要能访问”而是“未登录状态能访问到登录后才能看的资源”。4.3 认证绕过与访问控制的边界访问控制还有一个分支叫认证绕过它和越权经常一起出现。常见手法包括会话固定服务端在登录前后不更换Session ID攻击者可以先获取一个Session ID诱导受害者登录再使用这个Session ID冒充受害者身份Token未失效退出登录后JWT仍然有效或者修改密码后旧Token还能继续用JWT算法篡改把算法的alg字段改成none服务端如果支持无签名解析就能直接伪造身份或者拿到弱密钥后自签一个管理员Token。JWT这个点近年的考试题目里出现频率不低。测试时可以先解码JWT看payload再看Header里的alg字段最后尝试绕过。前提是服务端解析JWT时存在漏洞比如不检查签名、信任客户端传的算法等。实操细节在Burp里拦截登录请求把Token替换为伪造的版本后重放看服务端认不认。认了就是漏洞不认就换思路。认证绕过一旦成功基本等同于拿到了一个“管理员身份”后续的越权测试会顺畅很多。4.4 访问控制绕过技巧速查表整理一个我在实战和教学中常用的速查表你可以直接收藏漏洞类型常见测试手段关键判断点水平越权遍历ID、切换账号比对、修改请求体中的归属字段不同用户请求同一资源响应是否包含对方数据垂直越权修改角色字段、调用隐藏接口、替换HTTP方法普通用户请求管理接口是否成功未授权访问路径扫描、直接访问受限路径、查看接口文档未登录状态能否获取数据认证绕过JWT算法篡改、弱密钥爆破、会话固定伪造身份后服务端是否信任文件类越权修改文件名或路径参数、遍历下载接口能否下载其他用户的文件这张表建议打印出来或者记在笔记里每拿到一个目标就按表过一遍。不是每个接口都适用所有手段但系统性走一遍比随机试探效率高得多。5. 常见问题与排查技巧实录5.1 越权测试最容易踩的四个坑我自己踩过、也看学员踩过不少坑挑四个代表性的说。第一个坑改包之后页面没变化就以为漏洞不存在。实际上很多前端页面用的是异步请求你看到的数据是某个XHR接口返回的改的却是页面请求本身。正确做法是在浏览器DevTools里找到真正返回数据的那条接口再去Burp里对这条接口做改动。第二个坑多个账号并发使用Session串了。用Burp测试时如果在同一个浏览器里登录了A账号又拿B账号的包做测试容易混乱。建议把A账号固定在一个浏览器配置里B账号放在另一个或者用Burp的会话管理功能把Cookie区分开。第三个坑只关注状态码不关注响应内容。有的接口对越权请求返回403但对不存在的ID也返回403这时候要通过响应长度、响应体特征判断是权限拦截还是资源不存在。我习惯用Burp的对比功能把两个请求的Response放在一起看差异差异字段往往就是漏洞证据。第四个坑把登录框爆破当成访问控制测试。登录爆破属于认证测试访问控制测试是在已经登录的前提下测试授权是否有漏洞。两者要区分清楚考试答题和写报告时也不要混。5.2 如何区分访问控制漏洞与业务逻辑漏洞这个问题我经常被问。简单说访问控制漏洞的核心是“权限边界被突破”业务逻辑漏洞的核心是“业务流程可以被绕过”。举个例子订单查询接口用户A能查到用户B的订单这是访问控制问题属于越权订单状态从“已支付”直接改成“已发货”不按正常流程走这是业务逻辑问题。判断方法问题出在“谁可以访问什么”是访问控制问题出在“操作顺序、状态流转、数量金额约束”是业务逻辑。考试答题和写报告时分类准确会加分也方便后续修复定位。5.3 修复方案怎么写报告怎么交虽然CISP-PTE主要考发现和利用但理解修复方案对答知识题和写报告都有帮助。访问控制修复的核心原则是“后端强制、前端为辅”所有资源访问接口必须从会话中获取当前用户身份而不是信任前端参数对资源归属做服务端校验查询条件中加上当前用户ID之类的限制管理功能统一走独立权限校验逻辑用中间件、装饰器、过滤器统一处理避免每个接口单独写导致遗漏敏感操作增加二次校验修改密码、转账、删除这类操作不能只靠一个token决定日志记录完整审计信息至少包括操作者、操作对象、时间、结果方便事后追踪。写渗透测试报告时访问控制漏洞的影响评级通常偏高因为数据泄露范围可能覆盖所有用户。提交时要把复现步骤写清楚登录哪个账号、请求哪个接口、怎么改参数、看到了什么数据。复现步骤扎实报告的含金量会明显提升也能帮开发人员快速定位修复点。老实说访问控制是我自己在CISP-PTE备考时花时间最少、但得分回报最高的一块。它不像注入那样要背大量payload也不像综合场景那样对网络功底要求高核心就是“多想一步”这个接口既然能查到我的数据那把ID改一下能不能查到别人的这个按钮虽然没权限点但直接发请求到那个接口呢把这个思路练成肌肉记忆之后不仅考试顺手日常做授权渗透测试时也经常能在别人忽略的角落里快速出成果。最后再分享一个小窍门遇到越权类题目优先往数据最敏感的接口去测个人资料、订单、发票、文件下载、站内信这类地方flag通常就埋在里面。遍历ID的时候不要贪快一次改一个参数观察响应变化耐心一点。访问控制这一分往往是整个考试里最好拿、也最不该丢的一分。