感谢大家这半年来的不离不弃,这半年去闭关了,以后将确保每两周至少一篇技术文章,一定是原创,分享我在京东的一线问题相关的技术文章。一起学习进步。
在OWASP历年的漏洞TOP10排名中,有一类漏洞一直占据着一席之地,这个就是越权访问(Broken Access Control, 简称BAC)。下图1是2017年的TOP10排名,越权访问在TOP5的位置。而且从乌云平台上面搜 [越权]关键字 显示在2016年重要较大的越权问题上报有728条之多,下图2是乌云平台的搜索截图。
图1
图2
注:OWASP是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。乌云是一个位于是一个位于企业和安全研究人员之间的互联网漏洞报告平台。
一、什么是越权访问
顾名思义,越权访问是说本来你没有权限访问相应的代码或者数据,但是你现在却能够访问和操作。这个危害是很大的,而且这样的漏洞通过系统工具扫描起来也比较困难,因为它比较隐晦。这就要求我们在设计之初要能够考虑到。这类问题只要认知与意识跟上,则设计的时候也就能够避免了。
二、越权访问的种类
越权又分为水平越权和垂直越权。
2.1、水平越权
水平越权是说在访问WEB服务端的数据的时候,服务端应用程序未校验这条数据是否归属于当前登录请求用户。这样攻击者就能够获取到其他用户的数据,导致水平越权漏洞问题发生。攻击者可越权操作(增加、删除、修改和查询)其他用户的数据。
2.2、垂直越权
垂直越权又叫做权限提升。主要原因还是由于应用程序压根就没有做权限控制,或者是仅仅通过JavaScript代码在前端进行校验用户权限,导致攻击者绕过前端验证达到具备相应权限甚至权限提升的目的。
三、发生的根本原因
对于垂直越权,我们的解决方法是避免在前台页面端做校验。
根本原因实际上上文以及有阐述,水平越权是因为没有做数据的归属判断,这条数据如果不归属当前请求用户,还让该用户继续访问则就发生了水平越权问题。垂直越权产生的根本原因是没有权限控制或者是攻击者绕过了前端验证。
四、如何避免与解决
主要是从两个方面来避免,一方面是获取当前登录用户的方式,另外一方面增加数据归属判断。
4.1、获取当前的登录用户
禁止从 Get、Post 参数、Cookie 参数以及 Header 头重获取 pin 的值
String pin = request.getParameter(“pin”);
String pin = request.getHeader(“pin”);
Cookie[] cookies = request.getCookies();
for(Cookie item:cookies) {
if (item.getName().equals(“pin”)) {
String pin = item.getValue(); }
}
4.2、通过资源ID进行数据操作
比如按照订单号查询订单数据,根据传入的参数的可猜测性,如果不判断数据归属就可以获取别的用户的订单数据。如果是更新操作一样也会被攻击者操作成功。
五、总结
无论发生哪种越权的问题,主要是程序员的认知与意识不够,跟经验多少没有直接关系,当然经验有可能弥补这方面的不足。认知与意识跟得上,在设计之初就可以避免该漏洞的发生。