这里说的管理后台主要是指供企业内部用户使用的ToB类的系统,如OA、人力资源管理系统、财务系统、ERP系统等。长期以来,管理后台功能臃肿,不受重视,功能由不同的团队开发、使用第三方组件甚至直接是购买的第三方公司开发的系统。各种原因叠加之下导致它常常成为系统漏洞的高发区。拿JAVA来说,早期的管理后台大多由Java + JSP开发,新的技术栈则主要使用前后端分离的方式,前端使用如VUE等前端框架,后端则主要提供Rest接口的方式与前端交互。前后端分离后对管理后台的权限管理方式也产生了较大的影响。
权限问题
一个功能完整的管理后台通常都会有菜单、按钮的权限管理,对某个角色或用户,可以控制菜单或按钮的显示和隐藏。这些只是用户可见的部分,稍有经验的技术人员会直接在地址栏输入URL的方式来绕过表面的限制。比如正常情况下A只能访问URLA,B只能访问URLB,A只需要猜测得到URLB直接输入地址就进入了他不该有权限看到的页面。如果管理后台是前后端分离的,而且URL又是纯前端地址,那这种方式是防不住的,只能做好接口权限。
接口权限,是限制用户只能调用有权限的接口。这样可以有效避免非法的访问和调用,保护系统接口数据安全。要做到接口权限安全,通常会在每个接口调用时增加权限判断,有经验的程序员或使用注解或使用AOP配置的方式简化编码,但还是比较麻烦。如果接口没做权限控制或者只限制了登录的用户就有权限访问该接口,那普通用户只需要用猜测等方法得到了敏感接口地址,就能调用管理员才能调用的接口。
比接口权限更麻烦的是数据权限,数据权限是将行级数据权限和用户或角色进行绑定,限制用户只能访问和操作自己管辖范围内的数据。用户A对接口B有访问权限,不代理用户A对接口B能返回的所有数据都有权限,所以也可以说数据权限是更细粒度的接口权限。但是一般不能通过增加多个接口的方式来实现数据权限,因为角色或用户太多了。数据权限需要在建模时就提前设计,会通过增加列的方式标识能访问该行数据的权限级别。如果系统没做好数据权限,对攻击者来说最简单的利用方式就是把接口的入参改了。比如某用户具有组织架构管理的权限能看到广州分公司的组织架构,该功能调用的接口是:http://moext.com/org.jsp?root=020,他只需要改成http://moext.com/org.jsp?root=1(假设1是根组织),那就能看到全国的组织架构了。
另外一个权限问题高发区是“我的资料“功能,通常来说“我的资料“只需要从session中取用户,再按用户查询信息即可。但有些缺乏经验的程序员估计是为了复用用户管理查看用户信息的功能,把用户ID暴露给前端,由前端传用户ID过来查我的信息。据说早些年就有某公司程序员在公司的OA上利用这个漏洞拿到了整个公司员工的私密信息。
富文本编辑器
富文本编辑器可以允许用户使用不同的字体、颜色、大小和其他格式来编辑文本,同时还可以插入图片、视频等多种媒体类型,功能非常丰富。但是,正是由于功能丰富,我们无法像防XSS攻击一样过滤特殊字符,而且这些编辑器的附件上传功能通常是固化的,我们没办法做过多的限制。所以富文本编辑是XSS漏洞和文件上传漏洞的高发区。
功能丰富的查询条件
同样实现多查询条件下的X功能管理列表,在编码使用SQL拼接条件比用预编译占位的方式要方便太多了,但是前者虽然方便简单了但又引入了SQL注入漏洞。笔者甚至见过某知名的OA系统,它的工作流管理功能非常强大,但分析后发现管理员在前端加个审批节点后端是通过DDL建个临时表的方式实现的。攻击者可以轻松地修改表结构、删除数据等。这种既存在SQL注入漏洞又具有DDL权限的系统在一些旧的OA、ERP、人力资源管理系统上也不在少数。