一、访问控制
简单来说就是不同的人可控制的资源不同,例如通常情况下,游客是不可能对系统敏感文件进行操作的,只有管理员root可以操作。对于Web应用来说,**访问控制的实现依赖于身份验证与会话管理。**
1.身份验证:确认用户就是他们所说的那个人。
2.会话管理:识别同一用户正在发出哪些后续HTTP请求。
3.访问控制:确定是否允许用户执行他们正在尝试执行的操作。
不安全的访问控制很常见,并且通常会带来严重的安全漏洞。访问控制的设计和管理是一个复杂的动态问题,它将业务、组织和法律约束应用于技术实现。访问控制设计只能由人工做出,因此出错的可能性很高。
1.1基于参数的访问控制
一些站点或应用程序在用户登录时确定用户的访问权限或角色,然后将这些信息存储在用户可控制的位置,这可能包括:
1.一个隐藏字段。
2.一个Cookie。
3.一个预设的查询字符串参数。
那么该站点会根据这些值来做出访问控制决策,考察以下代URL:
https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1
显然这里是通过登录后admin的字段是否为true或者role是否为1来决策的,这肯定不安全,因为攻击者可以轻易的修改这些参数。
二、垂直越权
如果用户可以访问他们不被允许访问的功能,那么这就是垂直越权。例如,如果非管理用户可以访问管理页面,并在其中删除用户帐户,这就是垂直越权。
垂直越权常产生于未收权限保护的地方:例如,可以从管理员的Welcome页面链接管理重要功,但不能从用户的Welcome页面操作,但是如果限制不当,用户就可以通过浏览到相关的管理URL来访问管理功能。
https://insecure-website.com/admin。对于这个链接按理来说,只有登录后的管理员能访问该页面,但是如果没有限制,那么任何人都可能访问。
还有些链接会在robots.txt中,https://insecure-website.com/robots.txt。有时候一些后台链接会写在这个协议中,不允许爬虫爬取,但是攻击者可以直接访问该文件来获取未加限制的后台链接。
当然,即便是没有足够的信息,攻击者依然可以通过暴力的手段猜解哪些后台是存在的,这就是后台扫描。
这里还有些其他产生泄露的地方:
<script>
var isAdmin = false;
if (isAdmin) {
...
var adminPanelTag = document.createElement('a');
adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
adminPanelTag.innerText = 'Admin panel';
...
}
</script>
考虑上面一段前端JS代码,从代码的角度泄露了管理员的控制面板页面,并且仅仅检测了如果是管理员就进行自动跳转,如果其他用户得知了这个URL,他们也可以访问该URL
三、水平越权
如果用户能够访问属于另一个用户的资源,这就是水平越权。例如,如果一个员工既可以访问自己的记录,也可以访问其他员工的记录。
水平越权和垂直越权利用相似,例如如下URL:
https://insecure-website.com/myaccount?id=123
如果这个id的值可以被任何人访问,那么就会发生水平越权。
PS:这是一个不安全的直接对象引用(IDOR)漏洞的示例。当使用用户控制器参数值直接访问资源或函数时,就会出现这种类型的漏洞。
那么如果对方不使用数字,而使用一串全局唯一标识符(guid)来标识用户,这可以防止攻击者猜测或预测另一个用户的标识符。但是,属于其他用户的guid可能会在引用用户的应用程序的其他地方公开,例如用户消息或评论。
3.1水平越权升级为垂直越权
通常,**水平越权攻击可以通过危及更有特权的用户而转变为垂直越权攻击**。例如,水平越权可能允许攻击者重置或捕获属于另一个用户的密码。如果攻击者以管理用户为目标并危及其帐户,那么他们就可以获得管理访问权限,从而执行垂直越权。
攻击者可能能够使用已经描述的水平权限升级的参数篡改技术访问另一个用户的帐户页面,考察以下URL:
https://insecure-website.com/myaccount?id=456
目标用户是管理员,那么攻击者将获得对管理帐户页面的访问权。此页面可能会公开管理员的密码或提供更改密码的方法,或者可能提供对特权功能的直接访问.
四、靶场实战
4.1
在这个靶场中,我们可以通过访问robots.txt文件来获取一些信息:
发现管理员的控制面板页面,尝试访问:
web-security-academy.net/administrator-panel
可成功访问,于是删除该用户,完成挑战。
刚刚的案例是最简单的垂直越权,现在如果关键URL藏在其他地方:
4.2
将刚刚的靶场进行升级,但是从源代码中发现敏感JS泄露:
于是尝试访问/admin-mz509o
,成功来到后台:
4.3修改登陆参数进行垂直越权
现在题目给了我们一个非管理员账号与密码:winer,peter,我们需要用该账号完成垂直越权:利用BP抓包:
将响应包中的判断:Admin=False修改成true,然后放包
然后继续接受包,继续改成true
4.4寻找GUID进行水平越权
题目要求我们找到carlos用户的APIkey,我们现在只有wiener的账号,但是我们可以在评论区找到carlos的评论,并且在他的主页发现GUID:
于是我们先用我们的账号正常登陆,然后修改URL中的GUID即可
拿到APIKey,最后提交即可。
4.5利用水平越权重置管理员密码实现垂直越权
首先利用题目给我们的账号抓包登录,并拦截返回包:
之后点击发送,获取返回包信息:
将其改为administrator,然后一直放包,但是不能查看密码,密码重置也不行,这时候将网络包发送到Reapter,观察响应包:
发现管理员密码,用该密码登陆,然后执行删除操作即可。
五、总结
本次案例涉及到访问控制、垂直越权与水平越权,显然垂直越权的危害性更大,另外,返回包里可能有意想不到的信息。本次靶场主要是对一些越权操作进行了练习,也从侧面反应出鉴权的重要性。这次练习很有意义!
非特殊说明,本博所有文章均为博主原创。