从逻辑上讲,应用程序的核心安全机制——访问控制建立在验证和会话管理之上,如果应用程序的访问控制存在缺陷,攻击者往往能够很快的攻占这个应用程序。访问控制漏洞的概念其实很简单即应用程序允许攻击者执行或者访问某种攻击者不具备相应权限的功能或资源。常见的访问控制可以分为垂直访问控制、水平访问控制及多阶段访问控制(上下文相关访问控制),与其相应的访问控制漏洞为也垂直越权漏洞(普通用户可以访问或执行只有管理员才具有权限访问或执行的资源或功能),水平越权漏洞(某一用户可以访问或执行另一个用户才有权限访问或执行的资源或功能)及多阶段越权漏洞(某个操作可能需要多个步骤,比如银行转账,攻击者可能跳过前面步骤直接执行最后的步骤)。
常见的漏洞
有些功能根本就没有执行访问控制:
某些应用程序天真的认为只要将某些敏感的资源或者功能的访问路径仅公布给具有相应权限的用户就可以保证系统的安全,这种想法太天真了,攻击者可以通过各种途径发现那些路径,比如路径爆破或者利用Google,百度等强大的搜索引擎。更甚的是那些敏感资源或者功能的路径有可能会直接出现在HTML源码中,由前端的JS代码判断用户权限从而决定显示与否。比如下述代码:
var isAdmin = false;
if(isAdmin){
adminMenu.addItem("/menus/secure/ff457/addNewProtalUser2.jsp","Create a new user");
}
除了上述情况外某些外部API的调用也是有可能不受权限访问控制的,比如某一用户应该仅允许访问securityCheck接口的getCurrentUserRoles方法,如下所示:
http://wahh-app.com/public/securityCheck/getCurrentUserRoles
但是经过检查后发现还可以访问当前用户不具有权限访问的功能,比如:
http://wahh-app.com/public/securityCheck/getAllUsers
基于标识符的功能:
现实中某些应用程序还可能使用标识符来确定某一用户的身份,这种标识符通常作为Get,Post或者Cookie里面的某个参数,比如:
http://wahh-app.com/home.php?userId = 1305335
这种情况下攻击者仅需要通过遍历标识符或者在各种日志中收集标识符即可实现水平越权或者垂直越权。
多阶段功能:
某些应用程序在实现诸如添加用户,账户转账等需要多个阶段才能完成的功能时经常会认为用户既然成功的到达了当前阶段那么前面阶段肯定已经对用户的权限进行了验证,从而此阶段就不会再次验证而是直接允许此步骤的操作。这种想法如果被开发者实践到应用程序中就会存在这样的问题,比如攻击者摸清了最后一个阶段需要向服务器提交的各种参数那么他就可以通过直接构造参数并像最后一个阶段的处理文件提交从而避开权限验证直接实现添加用户或者转账的功能。