WebGoat Day2 Access Control Flaws

Using an Access Control Matrix

摘要

本课程就是感受 RBAC 系统的权限控制矩阵。
错误实现的 RBAC 系统,某些角色(以及与该角色关联的用户)会拥有它不该拥有的权限。

RBAC 简介

RBAC(Role Based Access Control)模型,基于角色的访问控制模型有三个原则:最小权限原则、责任分离原则和数据抽象原则。

关于水平权限和垂直权限

基于角色的访问控制按角色权限高低可分为两类:垂直权限控制和水平权限控制。
垂直权限控制作用在两类不同权限的角色之间,例如A是普通用户,B是管理员用户,那么B就拥有更多的可访问资源,这些资源包括某个URL下的资源、系统中的某个接口调用等。对于垂直权限控制,各编程平台都会有一些框架可以利用,因为垂直权限控制易于抽象,与具体业务耦合较少。Java Web开发程序员可以利用Spring Security,通过一些配置即可完成系统中的垂直权限控制需求(可基于URL和基于Method)。
水平权限控制是作用与相同的角色之间的。例如A、B都是社交网站的用户,他们对该网站上的资源拥有同样的权限,但是各自又都有一些私有数据,类似私信列表、好友列表。因为构造一个获取其他用户私有页面的URL(REST风格,很好构造)是很简单的,所以A用户可能只要改下URL中的ID等信息就能得到B用户的URL,这个环节不做权限控制显然不合理,而这里又很容易被疏忽掉。试想动辄上百个接口或URL,对每个都要做这样的水平权限判断,漏掉任何一个都会造成潜在漏洞。此外,这类漏洞自动化工具还不好扫描,不易察觉。因为水平权限控制判断的依据已经是数据级别的,所以一般框架较难处理这类情况,程序架构好点的可以通过拦截器对同类接口参数进行过滤和判断。否则,也只能具体接口具体判断了。

我现在只做过 Flask Web 开发,在用户权限管理这块主要是使用 Flask-Login ,垂直权限的管理只要用 @login_required 装饰器就行了,或者再添加一些自定义的权限检测装饰器。关于水平权限的隔离,暂时的思路,每个用户私信的REST url中再增加不同token来分离。
token的构造可以是 md5(用户名+uid)。

不过这样也侧面说明水平越权可能会更容易挖掘,另外我也很好奇例如QQ空间和微信朋友圈的权限控制系统会如何设计。
(对表中每一条记录,关联一个whitelist或者blacklist)

Bypass a Path Based Access Control Scheme

摘要

基于路径的访问控制可能会因为相对路径而绕过。

实验步骤

拦截HTTP请求,以相对路径方式修改请求资源。
修改File参数为以下参数

1
2
3
../../../../../WEB-INF/spring-security.xml
或者
../../../conf/tomcat-users.xml

自动化检测的可行性

感觉较难,难点在于应该读什么文件,不同的开发方式服务器目录组织不同。

Role Based Access Control

摘要

这个之所以能够进行越权操作的根本原因在于,网站把用户权限的校验放在了前台,用户一旦登陆进去之后的操作,就没有再进行验证了。导致用户可以越权操作。

实验步骤

这一步要求我们绕过业务层访问控制。它给出了很多人的用户名和密码,可以用他们的用户名和密码登陆系统,但是每个人在该系统中的权限不一样,因此能够进行的操作也不一样。其中HR是能够删除任意员工的简介的,首先用HR的账号登陆之后,删除一个员工的简介,用burpsuit抓取提交的post参数

然后登陆一个普通用户的账户,他只有查看和搜索用户的权限,在其查看用户的时候,截取其提交数据查看。

修改提交的参数的值,将“ViewProfile”改为“DeleteProfile”,执行成功

自动化检测的可行性

感觉比较难,暂时没有很好的思路。主要是操作的名称难以确定。

Remote Admin Access

摘要

远程原理员访问。应用程序通常会有一个管理界面,这个界面一般用户无法访问到,只有具有特权的用户才能访问。很多网站开发人员在脚本中预留了相关的参数接口,一旦该参数被后台程序确认,则访问者的权限会被放大,浏览到先前不能访问的资源,如:程序调试日志、隐藏功能菜单等。在URL里面加上一个参数admin=true,例如

1
http://localhost:8080/WebGoat/attack?Screen=86&menu=200&admin=true

这就是URL里面隐藏参数的识别。此时,在左侧栏的“Admin Function”,子功能下增加了另三个功能

自动化检测的可行性

虽然这个漏洞感觉很low,但自动化检测时不妨一试。
admin=True 之类要建立一个字典来fuzzing
对比有参数和无参数的服务器响应结果是否相同即可。
更粗暴的方法可以直接比较返回长度。

参考资料

[1] WebGoat之Access Control