1. 越权漏洞实战解析与Burpsuite靶场通关指南
越权漏洞(Broken Access Control)长期占据OWASP Top 10安全风险前三名,我在渗透测试项目中遇到的90%系统都存在这类问题。Burpsuite官方靶场作为业界公认的实战训练场,其越权漏洞场景设计极具代表性。下面分享我通关全部越权关卡的完整思路和避坑经验。
注意:所有测试仅限授权环境进行,实际操作前请确保获得合法授权
1.1 越权漏洞核心原理
越权漏洞本质是系统对用户权限校验不严格,导致低权限用户能执行高权限操作。主要分三类:
- 水平越权:同权限用户间数据非法访问(如A用户查看B订单)
- 垂直越权:低权限用户执行高权限功能(如普通用户删除管理员)
- 上下文越权:流程步骤绕过(如未支付直接跳转收货)
Burpsuite靶场典型案例:
GET /api/user/profile?id=123 HTTP/1.1 Host: victim.com仅靠前端隐藏按钮远远不够,后端必须对每次请求进行:
- 身份认证(Authentication)
- 权限校验(Authorization)
- 业务规则检查(Business Logic)
1.2 靶场环境配置要点
我推荐使用Kali Linux原生环境运行Burpsuite Community 2023.6版本(最新版对靶场兼容性最佳)。关键配置步骤:
- 浏览器代理设置:
export http_proxy="http://127.0.0.1:8080" export https_proxy="http://127.0.0.1:8080"- Burpsuite证书安装(解决HTTPS拦截问题):
- 访问http://burp/cert
- 下载cacert.der
- 导入浏览器信任库
- 靶场访问技巧:
- 使用隐身模式避免缓存干扰
- 不同关卡建议新建浏览器会话
- 遇到加载问题时可尝试清除
localStorage
2. 水平越权实战突破
2.1 用户ID枚举漏洞
靶场第一关演示了典型的水平越权。通过修改URL中的用户ID参数,可以查看他人信息。我总结的自动化测试方案:
- 使用Intruder模块进行ID爆破:
GET /api/user?id=§1§ HTTP/1.1 Host: target设置Payload为[1-1000]的数字序列
- 关键判断依据:
- 响应码200但内容长度不同
- 包含特定关键词(如email、address)
- 响应时间差异(存在用户的数据查询更慢)
实测技巧:设置"Grep - Extract"捕获返回数据中的邮箱字段,可快速定位有效用户
2.2 参数混淆攻击
靶场第五关展示了更隐蔽的越权方式。请求中同时存在明文ID和加密token:
POST /update_profile HTTP/1.1 { "user_id": 1024, "token": "a1b2c3d4", "role": "user" }突破方案:
- 先用自己的账号获取正常token
- 修改user_id保持token不变提交
- 观察系统是否仅校验token而忽略ID匹配
我编写的检测规则:
if response.json().get('is_admin') == True: log_vulnerability("IDOR via token reuse")3. 垂直越权高阶技巧
3.1 Cookie权限提升
靶场第九关需要从user升级到admin。通过分析Cookie结构发现:
session=base64("user:1001:role=user") --> 修改为 session=base64("user:1001:role=admin")实际操作中的注意事项:
- 先URL解码再base64解码
- 修改后要重新URL编码
- 某些系统会校验HMAC签名
3.2 JWT令牌篡改
现代Web应用常用JWT做认证。靶场第十二关的JWT结构:
{ "alg": "HS256", "typ": "JWT" } { "user": "guest", "exp": 1735689600 }攻击步骤:
- 修改alg为"none"移除签名验证
- 直接修改user字段为"admin"
- 删除签名部分(保留末尾的.)
关键点:服务器必须配置拒绝none算法才能防御
4. 自动化越权检测方案
4.1 Burpsuite插件开发
我编写的自动检测插件逻辑:
void checkIDOR(IHttpRequestResponse request){ String url = helpers.analyzeRequest(request).getUrl(); if(url.contains("id=") || url.contains("user=")){ sendToIntruder(request); // 自动发起参数爆破 } }4.2 自定义扫描规则
在Burp Scanner中添加以下检查项:
- 所有包含ID参数的请求
- 修改后是否返回相同数据结构
- 状态码为200但内容长度变化>15%
5. 防御方案深度解析
5.1 后端校验最佳实践
// Spring Security示例 @PreAuthorize("#userId == principal.id") public User getUser(Long userId){ // 方法实现 }必须实现的防御措施:
- 基于角色的访问控制(RBAC)
- 属性基访问控制(ABAC)
- 用户上下文绑定(如Spring Security的@PreAuthorize)
5.2 日志监控策略
建议记录的敏感操作日志:
CREATE TABLE security_log ( id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, action VARCHAR(50) NOT NULL, target_id BIGINT, ip_address VARCHAR(45), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) );我在实际项目中总结的越权漏洞防护体系:
- 输入验证:所有ID参数必须符合[0-9]+正则
- 权限校验:每个业务操作前检查用户权限
- 输出过滤:敏感字段根据权限动态返回
- 日志审计:关键操作留痕且不可篡改
- 定期渗透:至少每季度进行越权专项测试
6. 靶场通关速查表
| 关卡 | 漏洞类型 | 关键参数 | 突破技巧 |
|---|---|---|---|
| 1 | 基础IDOR | id | 直接修改数字ID |
| 3 | JSON越权 | user_id | 保持cookie修改body |
| 5 | 多参数依赖 | id+token | 仅修改id保留有效token |
| 7 | 文件名越权 | file | 路径遍历+文件名猜测 |
| 9 | Cookie提权 | session | base64解码修改后重编码 |
| 12 | JWT滥用 | Authorization | 改alg为none移除签名 |
7. 实战中的疑难问题解决
问题1:修改参数后返回403但页面依然变化
解决方案:系统可能采用前端校验,使用Burp Repeater直接重放请求
问题2:JWT修改后服务端报签名错误
排查步骤:
- 检查是否漏掉末尾的.
- 确认header和payload部分是否完整
- 尝试使用空签名(保留最后一个.)
问题3:靶场环境响应缓慢
优化方案:
- 关闭Burpsuite的被动扫描
- 在Project options中取消"Send to Scanner"
- 设置Proxy→Options里的线程数为1
8. 企业级安全加固建议
在金融行业项目中,我实施的增强方案包括:
- 动态权限令牌:每次请求生成临时操作令牌
- 行为指纹校验:结合IP、设备、操作习惯等多因素验证
- 敏感操作审批:关键功能需二级授权
- 实时风控拦截:异常请求自动触发验证码
某次渗透测试中的典型越权案例:
POST /transfer HTTP/1.1 { "from_account": "attacker", "to_account": "victim", "amount": 1000000 }防御方案:强制校验from_account必须等于当前会话用户
9. 扩展训练资源推荐
- PortSwigger Academy的Access Control模块
- OWASP Juice Shop靶场的权限挑战
- Hack The Box的Access Control类机器
- 我整理的越权漏洞检查清单:
- [ ] 所有包含ID的API接口
- [ ] 任何接收用户输入的角色字段
- [ ] 文件下载/查看功能
- [ ] 业务流程状态参数
最后分享一个快速检测越权的curl命令:
curl -s -H "Cookie: session=attacker" "http://target/api/user/123" | jq .email