07 · 测试 · 越权
按钮藏了,接口还是把别的店会员吐出来
安全测试工程师用越权请求证明服务端真的拒绝,不接受只把按钮藏起来的修复。权限模型怎么设计,是安全架构师的约束,不是他来立法。
开发:导出按钮已经按权限隐藏了。
安全测试:我不用按钮。用这个门店的登录态直接请求另一个门店的会员,仍然返回了手机号。
安全测试工程师证明约束没有旁路
安全架构师写了不允许导出和必须按门店过滤。安全测试工程师用请求去打这些句子。岗位特点是不从界面菜单开始。他用低权限账号、改参数、去掉分页、重放别人的单据号。页面上看不见入口,不代表接口拒绝。他记录请求、响应条数和是否含不该看见的字段。含有,就是缺陷,严重程度按数据是不是手机号、金额、全库来定。
他也测登录之后的会话:离职账号是否立即失效,实施共用账号是否还在,上传文件是否能变成可执行内容。这些和业务高峰无关,但上线检查必须有。他不把「请用户不要这么操作」当成修复。修复必须是服务端拒绝,并且拒绝写进审计。
回归要打同一条请求
开发说已经按门店过滤。安全测试用原来的请求再打一次,而不是看代码。过滤如果只写在某一个接口上,导出接口仍可能是旧的。他维护一份越权用例,进自动化之前先手工确认确实能代表攻击。自动化只防退步,不代替他发现新入口。
去掉分页之后的全库
门店账号本来只能看本店会员。请求里把分页改大、门店编号换成别的店,返回了两百条手机号。按钮确实隐藏了。缺陷退回后,服务端按账号绑定的门店强制过滤,导出改走审批。安全测试用脚本重放原请求,响应变为拒绝,审计里能看到这次拒绝。通过的证据是拒绝记录,不是一份说「已修复」的句子。
没有拒绝记录的修复,他不关闭缺陷。安全测试工程师也检查导出的文件本身。审批通过之后的文件如果还能被未审批的人用旧链接下载,缺陷仍然打开。链接要到期,到期后再访问应拒绝。他在权限收回的同一分钟重试下载,以此证明收回不是只改了页面上的菜单。菜单会骗人,链接不太容易骗人。上传入口他会试伪装成图片的脚本、超大会员表和重复文件名。系统即使不执行脚本,也不能把原文件直接放在可访问目录里当附件下载。拒绝的理由要写给上传者,审计里另记真实原因。对上传者说得越细,越要确认没有泄露内部路径。他用普通店员的账号尝试直接访问主管确认地址。
页面可以提示无权限,但接口也必须拒绝,并且不能返回单据内容。很多实现只挡了提交,却把详情先给了出去。详情里的成本、供应商和手机号已经足够造成泄露。无权限响应不能复用正常详情的结构,更不能只是少一个按钮。他把这次拒绝的请求号留进回归清单。下一次权限改动,先重放同一请求,再看代码差异。只看代码差异,容易漏掉另一个入口仍沿用旧查询。安全测试要相信重放,不要相信解释。