金融行业信息安全培训课程(三): 越权访问漏洞详解-文末考试

admin 2026-07-03 05:02:22 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详解越权访问漏洞在金融行业业务系统中的表现、成因与防御方案。核心观点是越权漏洞本质在于服务端未校验操作者对操作对象的访问权限,分为水平越权、垂直越权和未授权访问三类。文章通过银行存单比喻帮助理解,并逐一拆解了账户查询、交易记录、信贷审批等六大高发业务场景中的漏洞表现与攻击链路。最后提供了按业务模块分类的高发功能点清单,强调越权漏洞是银行系统中最常见且最易被忽视的高危风险。 综合评分: 85 文章分类: WEB安全,渗透测试,红队,内网渗透,安全意识


cover_image

金融行业信息安全培训课程(三): 越权访问漏洞详解-文末考试

原创

H H

401 Unauthorized

2026年7月1日 18:10 安徽

在小说阅读器读本章

去阅读

写在前面

如果说注入漏洞是”从数据库偷数据”,认证漏洞是”偷钥匙进屋”,那么越权漏洞就是——你已经拿到钥匙进了屋,但你本应该只能进客厅,结果发现卧室、书房、甚至楼上邻居家的门你都能打开。在银行业务系统中,越权漏洞是最常见、最高发、却最容易被忽视的漏洞类型。它不需要高超的技术手段,往往只需要修改一个 URL 参数、一个请求里的用户 ID,就能看到别人的账户、别人的交易、别人的贷款审批信息。本文将从一张银行存单的比喻入手,带你理解越权的本质,再逐一拆解银行业务中每一类越权漏洞的成因、场景和防御方案。


一、越权访问漏洞到底是什么?

1.1 一个比喻帮你彻底理解越权

你去银行柜台,想查一下自己的账户余额。柜员问了你的名字,然后就去后台查了。但你突然说:”诶,顺便帮我也看看隔壁老王的账户余额呗?”——如果柜员不核实你和老王的关系,直接就把老王的账户信息给你了,这就是越权

在技术世界里,”柜员”就是后端服务器,”账户编号”就是请求里的参数。如果服务器收到”查询账户编号=138″的请求时,不验证”当前用户是否有权访问账户138″,仅凭账户编号就返回数据,任何人都可以随意修改这个编号来查看他人的信息。

越权漏洞的核心本质:服务端没有校验”当前操作者”对”当前操作对象”的访问权限。

1.2 越权漏洞与其他漏洞的区别

| 对比维度 | SQL 注入 | 认证漏洞 | 越权漏洞 | | — | — | — | — | | 攻击者身份 | 不需要登录 | 冒充他人登录 | 用自己的账号登录即可 | | 技术门槛 | 需要技术知识 | 需要字典/工具 | 极低——改个数字就行 | | 工具可发现性 | 扫描器可部分发现 | 扫描器可部分发现 | 扫描器极难发现,必须人工 | | 在银行中的频率 | 逐渐减少(参数化查询普及) | 较高 | 最高 ——几乎每个接口都有风险 | | 危害表现 | 拖库、拿权限 | 盗号、冒充 | 批量窃取他人数据、操作他人账户 |

1.3 越权漏洞的三大类型

| 类型 | 通俗定义 | 银行场景 | 危险等级 | | — | — | — | — | | 水平越权(平行越权) | 同级别用户之间,A 能看 B 的数据 | 张三修改请求中的用户 ID,看到了李四的账户余额和交易记录 | 🔴 高危 | | 垂直越权(权限提升) | 低权限用户能干高权限用户才能干的活 | 普通柜员直接调用审批接口,给自己通过了一笔贷款申请 | 🔴 高危 | | 未授权访问 | 不需要登录,直接就能访问需要登录的页面 | 在浏览器直接输入后台管理页面的 URL,不登录就进去了 | 🔴 高危 |


二、水平越权(平行越权)详解

2.1 什么是水平越权

同一角色、同一权限等级的 A 和 B 两个用户,A 能访问 B 的私有数据——这就是水平越权。

场景化理解:

你和同事都住同一栋公寓楼,每人有自己的房间钥匙。你的钥匙本应该只能开你的门。但如果你发现你的钥匙居然能打开同事的房门——这就是水平越权。在银行系统里,”钥匙”就是你登录后的身份凭证,”房门”就是别人的账户数据。

2.2 水平越权的技术根源

银行系统中最典型的越权代码模式:

❌ 危险的写法:

-- 前端请求:GET /api/account/detail?accountId=138 -- 后端直接执行: SELECT * FROM accounts WHERE account_id = 138 -- ❌ 没有任何用户归属校验!任何人改 accountId 就能查任何账户

✅ 安全的写法:

-- 前端请求:GET /api/account/detail?accountId=138 -- 后端先验证归属,再查询: SELECT * FROM accounts  WHERE account_id = 138    AND user_id = CURRENT_USER_ID()  -- ✅ 加上了归属条件

核心问题就一句话:查询条件里有没有加上”当前用户”的限制?

2.3 银行业务中水平越权的六大高发场景

| 业务场景 | 漏洞表现 | 攻击方式 | 真实案例 | | — | — | — | — | | 账户信息查询 | 修改请求中的账户 ID,可查看他人账户余额、开户信息 | 抓包改 accountId 参数 | 手机银行”我的账户”接口,改 userId 遍历所有用户余额 | | 交易记录查询 | 修改交易流水号,可查看他人的转账、消费记录 | 遍历 transactionId 参数 | 转账记录详情页,修改 id 参数可看到所有人的交易明细 | | 个人信息查看 | 修改用户 ID 查看他人的身份证号、手机号、地址 | 遍历 userProfileId | “个人信息”页返回完整身份证号,且可通过 ID 遍历 | | 贷款/信用卡申请记录 | 查看他人的贷款申请状态、授信额度、还款记录 | 遍历 applicationId | 信用卡申请进度查询页,改申请编号看到所有人的申请 | | 绑卡/解绑操作 | 通过修改银行卡 ID,解绑他人的银行卡 | 修改 cardId 参数调用解绑接口 | 解绑接口只校验登录态,不校验银行卡归属 | | 消息/通知查看 | 查看他人的系统通知、验证码短信内容 | 遍历 messageId | 站内信接口可遍历查看所有用户的短信验证码通知 |

2.4 水平越权攻击链路演示

查看他人账户余额为例,一个完整的攻击链路:

| 步骤 | 操作 | 正常用户 | 攻击者 | | — | — | — | — | | ① | 登录手机银行 | 张三登录,查看自己的账户 | 李四登录,正常操作 | | ② | 进入”我的账户” | 前端请求 /api/accounts?userId=10001 | 抓包拦截请求 | | ③ | 篡改参数 | — | 将 userId=10001 改为 userId=10002 | | ④ | 重放请求 | — | 发送修改后的请求 | | ⑤ | 获取数据 | 正常看到自己的账户 | ✅ 看到了 userId=10002(张三)的账户余额和卡号 |

攻击者只需要写一个简单的脚本,从 10001 遍历到 99999,就能批量获取所有用户的账户信息。一个接口 + 一个循环 = 一次数据泄露事故。


三、垂直越权(权限提升)详解

3.1 什么是垂直越权

低权限用户(如普通用户、普通柜员)能够执行高权限用户(如管理员、审批人)才能执行的操作。本质是权限校验缺失或可绕过

场景化理解:

公司办公楼有门禁系统。普通员工的门禁卡只能开 1-3 楼的办公室,高管的卡能开所有楼层包括机房。但如果一个普通员工发现,只要把电梯按钮”用力按两下”就能直接到机房——这就是垂直越权。门禁系统看起来有,但存在绕过方式。

3.2 银行业务中垂直越权的五种典型表现

| 类型 | 漏洞描述 | 银行场景举例 | 攻击方式 | | — | — | — | — | | 直接调用后台接口 | 后台管理接口未做角色校验,知道 URL 就能调用 | 普通柜员直接请求 /admin/approveLoan 接口,审批通过自己的贷款 | 抓取前台请求中的后台 API 地址,直接用自己账号调用 | | 菜单隐藏≠权限控制 | 前端不显示管理员菜单,但后端接口不做权限校验 | 手机银行不显示”审批”按钮,但审批接口任何人都能调用 | 通过抓包工具直接发送审批请求 | | 参数中传角色 | 请求参数中包含用户角色,可被篡改 | 请求中 role=user,改成 role=admin 后获得管理员权限 | 修改请求中的角色参数 | | 接口未区分权限 | 查询、操作接口不区分用户角色,所有人看到所有数据 | 客户经理查询客户列表时,能看到全行所有支行的客户数据 | 正常查询接口返回了超越权限的数据 | | 低权限接口复用高权限逻辑 | 用户端接口直接复用了管理员端的后端逻辑,未做权限裁剪 | 用户”查看订单”和后台管理员”查看所有订单”调用的是同一个方法 | 前端传参不同,但后端逻辑相同且无校验 |

3.3 垂直越权攻击链路演示

普通用户绕过审批直接放款为例:

| 阶段 | 操作 | 说明 | | — | — | — | | ① 正常申请贷款 | 用户在手机银行提交贷款申请,状态变为”待风控审核” | 正常流程:提交 → 风控审核 → 人工审批 → 放款 | | ② 抓包分析 | 用户正常还款时抓包,发现还款接口需要传 loanId | 分析推理出放款接口格式 | | ③ 发现放款接口 | 通过前端 JS 源码或 API 文档发现 /api/loan/disburse?loanId=xxx | 接口名称很容易推断 | | ④ 直接调用 | 用自己的登录 Token 直接调用放款接口 | 后端只校验了登录态,未校验操作角色 | | ⑤ 绕过成功 | 贷款状态变为”已放款”,资金到账 | 全程绕过了风控和人工审批 |


四、未授权访问详解

4.1 什么是未授权访问

不需要任何身份凭证(不需要登录),直接通过 URL 就能访问本应受保护的页面或接口。这是越权的最极端形式——权限校验被完全跳过。

场景化理解:

银行后台管理系统通常需要用户名+密码+U盾才能登录。但如果有人发现,在浏览器直接输入 https://bank.com/admin/dashboard 就能直接进入后台——不需要登录——这就是未授权访问。

4.2 银行业务中未授权访问的高发位置

| 位置 | 具体表现 | 为什么会出现 | | — | — | — | | 后台管理页面 | 输入后台 URL 直接进入,无需登录 | 开发时为了方便关了鉴权,上线忘了开 | | API 文档页面(Swagger/OpenAPI) | 生产环境的 Swagger UI 可公开访问 | 上线时忘了关闭或限制访问 | | 监控面板(Grafana/Prometheus) | 系统监控页面无需登录即可查看 | 内部运维工具暴露在公网 | | 测试/调试接口 | 开发时留下的测试接口未删除,可直接调用 | 如 /api/test/resetPassword | | 静态资源中的敏感文件 | 配置文件、备份文件可直接下载 | 如 /backup/database.sql.gz | | 第三方回调接口 | 第三方回调 URL 未做来源校验 | 支付回调接口任何人都能调用 |

4.3 一个典型的未授权访问攻击链路

| 步骤 | 操作 | 说明 | | — | — | — | | ① | 攻击者对银行系统进行子域名扫描 | 发现 admin.bank.commonitor.bank.com 等 | | ② | 直接访问 admin.bank.com/login | 被拦截,需要登录 | | ③ | 尝试访问 admin.bank.com/swagger-ui.html | ✅ 直接打开!查看所有 API 接口 | | ④ | 从 Swagger 中找到 /api/admin/user/resetPassword | 接口参数:userId, newPassword | | ⑤ | 直接调用该接口 | ✅ 成功重置管理员密码 | | ⑥ | 用新密码登录后台 | 获取全量客户数据、交易记录 |


五、越权漏洞在银行业务系统中的高发功能点

本节将所有越权漏洞类型与银行真实业务模块做一一对应,帮助业务人员快速定位自己负责的系统是否存在风险。

5.1 按业务模块分类

用户认证与账户管理模块

| 功能点 | 越权类型 | 漏洞表现 | 入口参数 | | — | — | — | — | | 个人信息查询 | 水平越权 | 修改 userId 查看他人身份证、手机号 | userIdprofileId | | 账户余额查询 | 水平越权 | 修改 accountId 查看他人余额 | accountIdcardNo | | 实名认证 | 水平越权 | 修改认证记录 ID 查看他人认证信息 | authId | | 密码修改 | 水平越权 | 修改 userId 修改他人密码 | userIdtargetUserId | | 账户注销 | 水平越权 | 注销他人的账户 | accountId |

支付转账与资金清算模块

| 功能点 | 越权类型 | 漏洞表现 | 入口参数 | | — | — | — | — | | 转账记录查询 | 水平越权 | 修改流水号查看他人转账记录 | transIdorderNo | | 收款人管理 | 水平越权 | 查看或删除他人的常用收款人 | payeeId | | 交易明细导出 | 水平越权 + 垂直越权 | 导出他人的交易明细,或一次性导出超出权限范围的数据 | queryIduserId | | 对账文件下载 | 未授权访问 | 对账文件 URL 可猜测,直接下载 | 文件 URL | | 退款/冲正操作 | 垂直越权 | 普通用户调用退款接口 | refundId |

信贷审批与账务核算模块

| 功能点 | 越权类型 | 漏洞表现 | 入口参数 | | — | — | — | — | | 贷款申请查看 | 水平越权 | 查看他人的贷款申请详情和审批意见 | applicationId | | 授信额度查询 | 水平越权 | 查看他人授信额度和使用情况 | userIdcreditId | | 贷款审批操作 | 垂直越权 | 非审批角色调用审批接口 | applicationIdaction | | 放款操作 | 垂直越权 | 跳过风控和审批直接放款 | loanId | | 还款计划查看 | 水平越权 | 查看他人还款计划和逾期情况 | loanId | | 利率/费率修改 | 垂直越权 | 普通客户经理修改利率参数 | rateIdrateValue |

积分权益与营销活动模块

| 功能点 | 越权类型 | 漏洞表现 | 入口参数 | | — | — | — | — | | 积分查询 | 水平越权 | 查看他人积分余额和明细 | userId | | 优惠券查看 | 水平越权 | 查看他人的优惠券,甚至可使用他人的券 | couponId | | 兑换记录 | 水平越权 | 查看他人的兑换记录和收货地址 | exchangeId | | 奖品库存管理 | 垂直越权 | 非管理员修改库存数量 | prizeIdstock | | 活动配置修改 | 垂直越权 + 未授权访问 | 修改活动规则、中奖概率 | 活动管理接口 URL |

内部管理与后台运维模块

| 功能点 | 越权类型 | 漏洞表现 | 入口参数 | | — | — | — | — | | 客户列表查询 | 垂直越权 | 普通柜员导出全行客户数据 | branchIdqueryScope | | 柜员操作日志 | 水平越权 + 垂直越权 | 查看其他柜员的操作记录 | tellerId | | 系统配置修改 | 垂直越权 | 非管理员修改系统参数 | configKey | | 后台管理页面 | 未授权访问 | 知道 URL 直接进入后台 | 页面 URL | | 报表下载 | 未授权访问 + 垂直越权 | 无登录下载、无权限下载经营报表 | 报表 URL |

第三方合作与开放接口模块

| 功能点 | 越权类型 | 漏洞表现 | 入口参数 | | — | — | — | — | | 商户数据查询 | 水平越权 + 垂直越权 | 商户 A 查看商户 B 的交易数据 | merchantId | | 开放 API 调用 | 垂直越权 | 调用方权限范围过大,可获取不应有的数据 | scopeapiKey | | 合作方数据接口 | 水平越权 | 合作方通过修改商户号查看其他合作方的数据 | partnerId | | 数据导出接口 | 垂直越权 | 导出超出授权范围的数据 | dataScope |

5.2 按请求参数特征快速识别越权风险

| 参数类型 | 越权风险 | 说明 | | — | — | — | | 用户标识userId``user_id``uid | 🔴 极高 | 最常见的越权入口,修改后可访问他人数据 | | 业务对象 IDorderId``accountId``cardId``loanId | 🔴 极高 | 任何自增或有规律的 ID 都可能被遍历 | | 手机号/身份证phone``mobile``idCard | 🔴 高 | 作为查询条件时如果没有归属校验,可遍历 | | 页码/偏移量page``offset``start | 🟡 中 | 如果列表不做归属过滤,分页查询也能批量获取数据 | | 文件路径filePath``path``url | 🔴 高 | 可能被利用做目录遍历或未授权下载 | | 角色/权限标记role``isAdmin``permission | 🔴 极高 | 如果这些参数由前端传入且后端采信,可直接提权 |


六、如何判断业务系统是否存在越权漏洞

6.1 黑盒测试方法

水平越权测试

| 测试项 | 测试方法 | 预期安全表现 | 漏洞特征 | | — | — | — | — | | 修改用户 ID | 用自己的账号登录,抓包修改请求中的用户 ID 为其他用户的 ID | 返回”无权限”或统一报错(不暴露他人数据) | 成功返回他人的数据 | | 遍历业务 ID | 对订单号、流水号、申请号等自增 ID 进行遍历请求 | 只返回当前用户的数据或拒绝 | 返回了不属于当前用户的数据 | | 修改手机号 | 将请求中的手机号改为他人的手机号 | 拒绝或提示信息一致 | 成功查询到他人信息 | | 批量数据导出 | 在导出功能中修改过滤条件中的用户范围 | 只能导出自己的数据 | 导出了他人的数据 |

垂直越权测试

| 测试项 | 测试方法 | 预期安全表现 | 漏洞特征 | | — | — | — | — | | 低权限调用高权限接口 | 用普通用户 Token 直接请求管理员接口(从 JS 源码或文档获取 URL) | 返回 403 Forbidden | 接口正常执行 | | 修改角色参数 | 将请求中的 role=user 改为 role=admin | 角色由服务端从数据库读取,不受前端参数影响 | 权限发生变化 | | 直接访问后台页面 | 在未登录或用普通用户登录的状态下,直接输入后台管理页面 URL | 跳转到登录页或返回 403 | 直接进入管理页面 | | 接口参数权限测试 | 请求时传入超出当前用户权限范围的参数值(如查询所有支行的数据) | 只返回权限范围内的数据 | 返回了超出权限的数据 |

未授权访问测试

| 测试项 | 测试方法 | 预期安全表现 | 漏洞特征 | | — | — | — | — | | 不登录直接访问 | 清除所有 Cookie 和 Token,直接访问需要登录的接口 | 返回 401 未授权 | 返回业务数据 | | 常见敏感路径探测 | 访问 /admin``/swagger-ui.html``/druid``/actuator 等常见路径 | 404 或跳转登录 | 直接进入管理页面 | | 静态文件直接访问 | 猜测文件路径,直接访问 /backup/``/log/ 等 | 404 或 403 | 可直接下载 |

6.2 白盒代码审计方法

六步代码审计法

| 步骤 | 审计内容 | 检查要点 | | — | — | — | | ① 找入口 | 找到所有 Controller/Handler,列出所有对外暴露的接口 | 检查每个接口的 URL、参数列表 | | ② 看参数 | 审查每个接口的请求参数,重点关注用户 ID、业务对象 ID | 记录所有可被篡改的 ID 类参数 | | ③ 追鉴权 | 跟踪每个接口的鉴权逻辑——是否有 @PreAuthorize、拦截器、Filter | 是否有接口遗漏了鉴权注解 | | ④ 核归属 | 检查数据查询/操作时,是否将”当前用户”作为过滤条件 | 查询语句中是否包含 userId = currentUser.id | | ⑤ 验角色 | 检查操作类接口(增删改)是否校验了用户角色权限 | 是否有接口未区分普通用户和管理员 | | ⑥ 查配置 | 检查 Spring Security / Shiro 的拦截器配置,是否有遗漏的路径 | 配置中是否有 /admin/** 被遗漏 |

代码审计检查清单

| 编号 | 检查项 | 是否通过 | | — | — | — | | C1 | 所有数据查询是否带上了当前用户 ID 的条件过滤? | ☐ | | C2 | 是否有查询直接使用请求参数中的 ID 而不校验归属? | ☐ | | C3 | 所有管理类接口是否有角色权限校验(非仅登录校验)? | ☐ | | C4 | 增删改操作接口是否校验了操作权限和数据归属? | ☐ | | C5 | 是否有接口通过前端传入的 role/permission 参数判断权限? | ☐ | | C6 | 权限拦截器配置是否覆盖了所有接口路径?是否有遗漏? | ☐ | | C7 | 生产环境是否关闭了 Swagger、Actuator 等调试/监控端点? | ☐ | | C8 | 是否存在可通过 URL 猜测直接访问的静态资源(备份文件、日志等)? | ☐ | | C9 | 文件下载接口是否校验了文件归属和路径合法性? | ☐ | | C10 | 批量导出/查询接口是否有数据范围限制? | ☐ |

6.3 越权漏洞的典型 HTTP 响应特征

| 情况 | HTTP 响应 | 说明 | | — | — | — | | 正确的安全实现 | 403 + {"code": 403, "message": "无权限"} | 明确拒绝 | | 隐蔽的安全实现 | 200 + {"data": null} 或 200 + 空列表 | 不暴露信息差异,但本质上已阻止 | | 明显的漏洞 | 200 + 返回了他人的完整数据 | 典型越权 | | 数据脱敏但仍有信息泄露 | 200 + 返回了部分数据(姓名脱敏但金额可见) | 仍是越权,只是做了表面处理 | | 返回错误但暴露了信息 | "userId=10002 不存在" vs "账户余额为 0 元" | 虽然不是越权,但暴露了用户是否存在 |


七、越权漏洞的防御方法

7.1 核心防御原则:三层校验模型

| 层级 | 校验内容 | 校验方法 | 如果缺失会怎样 | | — | — | — | — | | 第一层:身份校验 | “你登录了吗?” | 全局拦截器校验 Token/Session | 未授权访问 | | 第二层:归属校验 | “这个数据是你的吗?” | 查询条件强制追加 userId = currentUser.id | 水平越权 | | 第三层:角色校验 | “你有权执行这个操作吗?” | RBAC 权限模型,接口级角色校验 | 垂直越权 |

三层缺一不可。每一层都必须独立校验,不能依赖上一层已经校验过就跳过。

7.2 水平越权防御方案

方案一:查询条件强制绑定当前用户(推荐)

✅ 正确模式:  // 用户查询自己的账户 @GetMapping(“/api/account/{accountId}”) public Account getAccount(@PathVariable Long accountId) {     // 从 Token/Session 中获取当前登录用户     Long currentUserId = SecurityContext.getCurrentUserId();     // 查询时必须带上当前用户 ID 作为条件     return accountService.findByAccountIdAndUserId(accountId, currentUserId);     // ✅ 即使前端传了他人的 accountId,由于不匹配 currentUserId,     //    查询不到任何数据,自然无法越权 }


方案二:统一数据权限过滤器(高级)

使用 AOP 切面或 MyBatis 拦截器,自动为所有查询追加归属条件:

| 方式 | 实现 | 优点 | 缺点 | | — | — | — | — | | ORM 拦截器 | MyBatis Interceptor 自动追加 WHERE user_id = #{currentUserId} | 统一、不易遗漏 | 需要处理特殊场景的豁免 | | AOP 切面 | 在 Service 层切面校验入参 ID 是否属于当前用户 | 灵活、可精细控制 | 需要为每个 Service 方法配置 | | 数据权限框架 | 使用 Spring Security ACL / Apache Shiro 的数据权限模块 | 成熟、文档齐全 | 引入较重,学习成本高 |

7.3 垂直越权防御方案

方案一:基于角色的接口权限控制(RBAC)

✅ 正确的权限模型: &nbsp;@RestController @RequestMapping("/api/admin") public class AdminController { &nbsp; &nbsp; &nbsp;// 只有 ADMIN 角色可以调用 &nbsp; &nbsp; @PreAuthorize("hasRole('ADMIN')") &nbsp; &nbsp; @PostMapping("/approveLoan") &nbsp; &nbsp; public Result approveLoan(@RequestBody ApprovalRequest req) { &nbsp; &nbsp; &nbsp; &nbsp; // ... &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp;// 只有 ADMIN 或 APPROVER 角色可以查看 &nbsp; &nbsp; @PreAuthorize("hasAnyRole('ADMIN', 'APPROVER')") &nbsp; &nbsp; @GetMapping("/applications") &nbsp; &nbsp; public List<Application> listApplications() { &nbsp; &nbsp; &nbsp; &nbsp; // ... &nbsp; &nbsp; } }

关键要求: 权限判断必须在服务端完成。前端隐藏菜单只是 UI 层的便利,不能作为安全控制手段。

方案二:权限判断规则

| 规则 | 说明 | 示例 | | — | — | — | | 最小权限原则 | 每个角色只赋予完成工作所必需的最小权限 | 柜员只能看本支行的客户,不能看全行 | | 默认拒绝原则 | 权限配置默认拒绝,需要明确授权才能访问 | 新接口不加权限注解 = 任何人不能访问 | | 接口级粒度 | 权限控制到每个接口,而非模块级别 | 能查客户的接口 ≠ 能修改客户的接口 | | 数据范围绑定 | 角色权限绑定数据范围(如:支行级、分行级、总行级) | 客户经理 A 只能看自己管辖的客户,不能看全行 |

7.4 未授权访问防御方案

| 措施 | 具体做法 | 优先级 | | — | — | — | | 全局登录拦截器 | 配置 Filter/Interceptor,对所有需要认证的路径进行拦截,未登录统一返回 401 | 🔴 最高 | | 生产环境关闭调试端点 | 关闭 Swagger UI、Spring Boot Actuator、Druid 监控等 | 🔴 最高 | | 敏感路径白名单机制 | 只允许特定 IP 访问后台管理页面(或通过 VPN) | 🟡 高 | | 静态资源权限控制 | 将可下载的文件(报表、备份)放在非 Web 可访问目录,通过接口鉴权后下载 | 🟡 高 | | 定期路径扫描 | 定期使用目录扫描工具检查是否有遗漏的未授权接口 | 🟢 中 |

7.5 防御架构总览图

| 防御层 | 防御目标 | 关键技术 | 在银行系统中的应用 | | — | — | — | — | | 网关层 | 未授权访问 | API 网关统一鉴权,未登录请求直接拒绝 | 所有对外接口经过网关,网关校验 Token | | 拦截器层 | 未授权访问 + 垂直越权 | Spring Security / Shiro 过滤器链 | 配置所有需要鉴权的路径和角色 | | Controller 层 | 垂直越权 | @PreAuthorize 注解 + RBAC | 每个接口明确所需角色 | | Service 层 | 水平越权 | 业务层校验数据归属,查询条件追加 userId | 每笔数据查询都绑定当前用户 | | ORM 层 | 水平越权 | MyBatis 拦截器自动追加归属过滤 | 所有 SQL 自动添加用户维度过滤 | | 数据库层 | 水平越权(最后兜底) | 数据库行级安全策略(Row-Level Security) | PostgreSQL RLS,Oracle VPD 等 | | 运维层 | 持续发现 | 定期渗透测试 + 代码审计 + 越权专项扫描 | 每个迭代进行越权测试 |


八、银行业务人员自查清单

8.1 开发人员自查清单

| 编号 | 自查项 | 是否完成 | | — | — | — | | D1 | 我开发的所有查询接口,是否都校验了数据归属(SQL 中追加 userId)? | ☐ | | D2 | 我开发的所有操作接口(增删改),是否都校验了操作权限? | ☐ | | D3 | 是否有接口仅靠前端隐藏按钮来控制权限? | ☐ | | D4 | 我是否使用了参数化查询(防止 SQL 注入的同时也防止通过注入绕过权限)? | ☐ | | D5 | 返回给前端的数据,是否做了敏感字段脱敏? | ☐ | | D6 | 我的代码中是否有直接从 Request 参数中取 userId 并查询的写法? | ☐ | | D7 | 批量操作接口是否有数量限制和数据范围限制? | ☐ | | D8 | 我是否复核了权限拦截器配置,确保新接口被覆盖? | ☐ |

8.2 测试人员自查清单

| 编号 | 自查项 | 是否完成 | | — | — | — | | T1 | 是否对每个查询接口都做了水平越权测试(修改 ID 参数)? | ☐ | | T2 | 是否对每个操作接口都做了垂直越权测试(低权限调高权限接口)? | ☐ | | T3 | 是否测试了未登录直接访问需要登录的接口? | ☐ | | T4 | 是否测试了 ID 遍历——连续请求不同 ID,观察返回是否一致属于当前用户? | ☐ | | T5 | 是否测试了批量请求——并发发送多个不同 ID 的请求? | ☐ | | T6 | 是否测试了管理员接口的访问控制(普通用户能否直接调用)? | ☐ | | T7 | 是否扫描了生产环境的 Swagger/Actuator/调试页面? | ☐ | | T8 | 是否在测试报告中记录了每个接口的越权测试结果? | ☐ |

8.3 运维/安全人员自查清单

| 编号 | 自查项 | 是否完成 | | — | — | — | | O1 | 生产环境是否关闭了所有调试端点(Swagger, Actuator, Druid 监控等)? | ☐ | | O2 | 后台管理系统是否限制了访问 IP(或仅通过 VPN 访问)? | ☐ | | O3 | 是否配置了访问日志,记录所有越权尝试(403 响应)? | ☐ | | O4 | 是否设置了越权告警规则(同一用户短时间内大量 403)? | ☐ | | O5 | 是否定期进行越权专项渗透测试? | ☐ | | O6 | 新建接口上线前,是否有越权安全检查卡控? | ☐ |


九、总结

| 维度 | 核心要点 | | — | — | | 水平越权 | A 看 B 的数据——查询必须绑定 currentUserId | | 垂直越权 | 低权限干高权限的事——每个接口校验角色 | | 未授权访问 | 不登录也能用——全局拦截器 + 关闭调试端点 | | 一句话记住 | 永远不要相信前端传来的 ID 和角色。数据的归属、操作的权限,全部在服务端独立判断。 |

  扫码参与考试

下篇预告: 模块四将讲解 跨站脚本(XSS)与跨站请求伪造(CSRF) 漏洞。这两种漏洞虽然不直接攻击数据库,但可以劫持用户的浏览器、冒用用户身份发起操作,在银行支付、转账等场景中危害极大。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:401 Unauthorized H H《金融行业信息安全培训课程(三): 越权访问漏洞详解-文末考试》

评论:0   参与:  0