无论是SRC还是HackerOne,发现可简单直接利用的漏洞越来越少,结合业务逻辑漏洞越来越多。之前文章提到需要基于甲方视角来建设扫描器,传统的黑盒扫描器不理解业务。一顿操作猛如虎,结果逻辑都没进。比如一个提现接口的SQL注入漏洞需要满足可信设备、行为可信、二次认证等前置条件,传统扫描器可能第一步都没通过,如何能发现漏洞,发现不了也就罢了但很有可能说漏洞不存在。满足业务前置条件还能有好的方案去实现,但如果遇到更贴近业务的越权、逻辑绕过类的漏洞就难以发现了。本文不讨论发现,主要从杜绝漏洞出现的角度,重新提下这个古老但简单有效的缓解水平越权漏洞方案。
分析下常见各类真实的水平越权案例,水平越权的本质在于一个没有拥有目标资源的人去访问该资源而又没有做权限校验,理想状态下能将所有资源访问做好资源Owner和访问用户的校验就可以解决,但现实情况是没有技术手段依赖人必然会存在遗漏。观察历史的各种真实出现的漏洞案例,可发现大多数都涉及到参数中存在ID字段,而水平越权的核心在于目标资源可枚举、可碰撞、可猜测,而目标资源的常见形式是数字ID字段。
所有暴露在前端的数字ID通过私有算法转换为字母加数字的字符串,私有算法可还原,逻辑仅在后端实现,即可有效避免枚举、碰撞、猜测导致的水平越权风险。该方案在五六年前在前公司实践,效果非常好。方案的优势在于非常简单容易理解和实现,同时可分析流量来覆盖全量避免遗漏,同时可以扫描代码中ID和资源使用来检查ID转换组件使用情况来卡点避免新增遗漏,缺点是缓解水平越权而非根治水平越权,同时需要考虑好算法泄露、碰撞或破解需要更新算法情况。具体的算法实现多种多样,可以是对称加密也可以是定制进制转换甚至定制算法都行,不做具体展开。