SwanQ's Blue SKY

TO LIVE IS TO RISK IT ALL

0%

越权访问BAC-Broken Access Contro

0x01 前言

本文将谈谈越权那些事儿。靶场也是本博客的传统–pikachu。

0x02 谈谈越权

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。

攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定,一旦权限验证不充分,就易致越权漏洞。

原理:

Web 程序功能流程是登录 - 提交请求 - 验证权限 - 数据库查询 - 返回结果。如果验证权限不足,便会导致越权

一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的地方,当用户对权限页面内的信息进行这些操作时,后台需要对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

分类:

主要分为水平越权和垂直越权

case1: 隐藏 URL

有些程序的管理员的管理页面只有管理员才显示,普通用户看不到,利用 URL 实现访问控制,但 URL 泄露或被恶意攻击者猜到后,这会导致越权攻击。

解决:验证用户身份,验证用户是否具备操作数据的权限

case2: 直接对象引用

通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的 ID 号时会返回他人的信息,便产生了水平越权。

解决:直接对象引用的加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理

case3: 多阶段功能

多阶段功能是一个功能有多个阶段的实现。例如修改密码,可能第一步是验证用户身份信息,号码验证码类的。当验证成功后,跳到第二步,输入新密码,很多程序会在这一步不再验证用户身份,导致恶意攻击者抓包直接修改参数值,导致可修改任意用户密码。

解决:执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限,特别敏感操作可以让用户再次输入密码或其他的验证信息。

case4: 静态文件

网站的下载功能,一些被下载的静态文件,例如 pdf、word、xls 等,可能只有付费用户或会员可下载,但当这些文件的 URL 地址泄露后,导致任何人可下载,如果知道 URL 命名规则,则会便利服务器的收费文档进行批量下载。

解决:加密静态文件命名规则,防止攻击者枚举;敏感数据特殊化处理

case5: 平台配置错误

程序会通过控件来限制用户的访问,例如后台地址,普通用户不属于管理员组,则不能访问。但当配置平台或配置控件错误时,就会出现越权访问。

解决:配置控件上点心儿吧

如何防止:

在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

靶场练习:

当我们以lucy身份登陆进系统时,可以看到username参数可控,当我们改成其他用户时,可以看到其他用户的个人信息。这属于水平越权。

接下来看看垂直越权,由于后台处理数据的逻辑存在漏洞,对于发送的数据包并没有判断当前数据包的用户权限,所以存在越权漏洞,具体看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$link=connect();
// 判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
header("location:op2_login.php");
exit();
}
if(isset($_POST['submit'])){
if($_POST['username']!=null && $_POST['password']!=null){//用户名密码必填
$getdata=escape($link, $_POST);//转义
$query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['address']}')";
$result=execute($link, $query);
if(mysqli_affected_rows($link)==1){//判断是否插入
header("location:op2_admin.php");
}else {
$html.="<p>修改失败,请检查下数据库是不是还是活着的</p>";

}
}
}

先登录admin账户创建test1用户,此时抓包.并发送到repeater模块

然后登陆普通用户pikachu,获取普通用户的cookie.

用此cookie覆盖之前admin用户的cookie,重放数据包,发现用户swanQ成功创建.

总结

这句话很有道理:

水平越权相当于用别人的卡,而垂直越权相当于用低价购买奢侈品。