WebGoat之Access Control

Using an Access Control Matrix

RBAC(Role Based Access Control)模型,基于角色的访问控制模型有三个原则:最小权限原则、责任分离原则和数据抽象原则。不同的人对不同的资源有不同的访问权限。这一步的作用是用来熟悉该站点所使用的访问控制规则,以下是该实验中的不同角色权限:
8

如下图,表示成功:
1
这里插一段话,既然提到了基于角色的访问控制,那就要明白水平权限和垂直权限的意思。之前都学到了这里,却没有继续深入水平权限与垂直权限,在百度二面的时候,问到这个居然是完全懵逼的状态。

基于角色的访问控制按角色权限高低可分为两类:垂直权限控制和水平权限控制。
垂直权限控制作用在两类不同权限的角色之间,例如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

绕过路径访问控制。
这个任务就是要读取我们一般不能读的文件,如下图所示:
2

一般就是从左边选择一个文件,然后点击“View File”,在页面最下面会给出文件内容,重点在于它给出了我们读取文件的目录位置:

F:\WebGoat-OWASP_Standard-5.2\WebGoat-5.2\tomcat\webapps\WebGoat\lesson_plan\ConcurrencyCart.html

而我们的目标文件位置为:

tomcat\conf\tomcat-users.xml

也就是说要从上面的位置读到下面的位置,采用相对路径去读取。

通过打开burpsuite,拦截浏览器发送给服务器端的数据,并修改,再传送,如下图所示:
3
可以看到File那一栏的参数是可以修改的。
修改为如下值:

../../../conf/tomcat-users.xml

4
成功之后可以看到,读取的是tomcat的一份很重要的配置文件。

Role Based Access Control

关于基于角色的访问控制,具体实验过程分为如下四步:

Bypass Business Layer Access Control

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

然后登陆一个普通用户的账户,他只有查看和搜索用户的权限,在其查看用户的时候,截取其提交数据,与前面比较,如下所示:
6
修改提交的参数的值,将“ViewProfile”改为“DeleteProfile”,执行成功:

7

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

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
29
try
{
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
2
3
4
if(!isAuthorized(s,getUserId(s),requestedActionName)
{
throw new UnauthorizedException();
}

由于我用的是WebGoat5.2标准版,因此无法实际实施查看效果,只有开发版的才可以。

Bypass Data Layer Access Control

这里需要绕过数据访问控制层,需要利用Tom的身份越权访问另一名员工的信息。这里同样是通过“ViewProfile”按钮,然后截取修改提交参数的id字段,达到越权访问的目的。

Add Data Layer Access Control

这一步需要添加数据访问控制层以修复上一步的漏洞。这里需要在与第二步一样的地方,添加如下代码:

1
2
3
4
if(!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”,子功能下增加了另三个功能,如下图所示:
9

然后通过发送请求的时候,在URL上加参数,如下图所示:
10

最后均可成功显示。

Summarize

这一节主要讲Web应用程序的访问控制,之前在本科学过访问控制,大概知道有很多种不同类型的访问控制模型。直到今天,才真正理解了访问控制的作用,看来凡事不实际操作,永远只是停留在表层的,继续努力!


【版权声明】
本文首发于戚名钰的博客http://qimingyu.github.io/ ),欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:mingyuqi.java@qq.com
欢迎关注我的微信公众号:科技锐新

本文永久链接:http://qimingyu.github.io/2016/04/25/Webgoat之Access_Control/

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章