Using an Access Control Matrix
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,对每个都要做这样的水平权限判断,漏掉任何一个都会造成潜在漏洞。此外,这类漏洞自动化工具还不好扫描,不易察觉。因为水平权限控制判断的依据已经是数据级别的,所以一般框架较难处理这类情况,程序架构好点的可以通过拦截器对同类接口参数进行过滤和判断。否则,也只能具体接口具体判断了。
Bypass a Path Based Access Control Scheme
绕过路径访问控制。
这个任务就是要读取我们一般不能读的文件,如下图所示:
一般就是从左边选择一个文件,然后点击“View File”,在页面最下面会给出文件内容,重点在于它给出了我们读取文件的目录位置:
F:\WebGoat-OWASP_Standard-5.2\WebGoat-5.2\tomcat\webapps\WebGoat\lesson_plan\ConcurrencyCart.html
而我们的目标文件位置为:
tomcat\conf\tomcat-users.xml
也就是说要从上面的位置读到下面的位置,采用相对路径去读取。
通过打开burpsuite,拦截浏览器发送给服务器端的数据,并修改,再传送,如下图所示:
可以看到File那一栏的参数是可以修改的。
修改为如下值:
../../../conf/tomcat-users.xml
成功之后可以看到,读取的是tomcat的一份很重要的配置文件。
Role Based Access Control
关于基于角色的访问控制,具体实验过程分为如下四步:
Bypass Business Layer Access Control
这一步要求我们绕过业务层访问控制。它给出了很多人的用户名和密码,可以用他们的用户名和密码登陆系统,但是每个人在该系统中的权限不一样,因此能够进行的操作也不一样。其中HR是能够删除任意员工的简介的,首先用HR的账号登陆之后,删除一个员工的简介,用burpsuit抓取提交的post参数,得到如下结果:
然后登陆一个普通用户的账户,他只有查看和搜索用户的权限,在其查看用户的时候,截取其提交数据,与前面比较,如下所示:
修改提交的参数的值,将“ViewProfile”改为“DeleteProfile”,执行成功:
这个之所以能够进行越权操作的根本原因在于,网站把用户权限的校验放在了前台,用户一旦登陆进去之后的操作,就没有再进行验证了。导致用户可以越权操作。
Add Business Layer Access Control
这一步要求我们在原始代码中增加一个业务访问控制层。关于这里相对应的代码在RoleBasedAccessControl.java文件中,相应路径为:
F:\WebGoat-OWASP_Standard-5.2\WebGoat-5.2\tomcat\webapps\WebGoat\JavaSource\org\owasp\webgoat\lessons\RoleBasedAccessControl\RoleBasedAccessControl.java
其中有一个handleRequest()函数,这个函数就是用来处理用户操作传过来的请求。其中主要的代码片段为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29try
{
DefaultLessonAction action = (DefaultLessonAction) getAction(requestedActionName);
if (action != null)
{
// System.out.println("RoleBasedAccessControl.handleRequest() dispatching to: " +
// action.getActionName());
if (!action.requiresAuthentication())
{
// Access to Login does not require authentication.
action.handleRequest(s);
}
else
{
//***************CODE HERE*************************
//*************************************************
if (action.isAuthenticated(s))
{
action.handleRequest(s);
}
else
throw new UnauthenticatedException();
}
}
else
setCurrentAction(s, ERROR_ACTION);
}
就是在“code here”那里添加代码,客户端传到服务器的action如果不为空的话,有两种情况,一种是不需要进行权限验证的,例如登陆操作,另一种是需要进行权限验证的,例如删除,查看等。在这里需要添加我们的一段代码如下:
1 | if(!isAuthorized(s,getUserId(s),requestedActionName) |
由于我用的是WebGoat5.2标准版,因此无法实际实施查看效果,只有开发版的才可以。
Bypass Data Layer Access Control
这里需要绕过数据访问控制层,需要利用Tom的身份越权访问另一名员工的信息。这里同样是通过“ViewProfile”按钮,然后截取修改提交参数的id字段,达到越权访问的目的。
Add Data Layer Access Control
这一步需要添加数据访问控制层以修复上一步的漏洞。这里需要在与第二步一样的地方,添加如下代码:1
2
3
4if(!action.isAuthorizedForEmployee(s, getUserId(s),s.getParser().getIntParameter(RoleBasedAccessControl.EMPLOYEE_ID, 0)))
{
throw new UnauthorizedException();
}
Remote Admin Access
远程原理员访问。应用程序通常会有一个管理界面,这个界面一般用户无法访问到,只有具有特权的用户才能访问。很多网站开发人员在脚本中预留了相关的参数接口,一旦该参数被后台程序确认,则访问者的权限会被放大,浏览到先前不能访问的资源,如:程序调试日志、隐藏功能菜单等。在URL里面加上一个参数admin=true,例如:
http://localhost:8080/WebGoat/attack?Screen=86&menu=200&admin=true
这就是URL里面隐藏参数的识别。此时,在左侧栏的“Admin Function”,子功能下增加了另三个功能,如下图所示:
然后通过发送请求的时候,在URL上加参数,如下图所示:
最后均可成功显示。
Summarize
这一节主要讲Web应用程序的访问控制,之前在本科学过访问控制,大概知道有很多种不同类型的访问控制模型。直到今天,才真正理解了访问控制的作用,看来凡事不实际操作,永远只是停留在表层的,继续努力!
【版权声明】
本文首发于戚名钰的博客,欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:qimingyu.security@foxmail.com
欢迎关注我的微信公众号:科技锐新
本文永久链接:http://qimingyu.github.io/2016/04/25/Webgoat之Access_Control/