越权漏洞

  • 水平越权:同一层级间的用户可以互相访问到对方的敏感信息;同时还可能会以其他平级权限用户的身份来执行某种功能,如删除、添加、修改等;
  • 垂直越权:低权限用户来执行高权限用户功能;

常见越权方法:

  • 修改 GET、POST、cookie 传参进行越权。

以 pikachu 靶场为例

水平越权

点击提示可以看到已存在的一些用户和密码信息。

20241216232925

登录其中一个查看个人信息,页面显示该用户的相关信息。(lucy/123456)

20241216233043

URL 中有 username 字段,对其直接进行修改访问,成功获取到 lili 的个人信息,即水平越权。(在没有登录 lili 账号的情况下,成功访问到 lili 的相关内容)

20241216233130

源码分析,查找用户信息的时候传入的参数是直接从 URL 中获取的,没有校验当前用户。

file:op1_mem.php
1
2
3
4
5
6
7
8
9
$link=connect();
// 判断是否登录,没有登录不能访问
if(!check_op_login($link)){
header("location:op1_login.php");
}
$html='';
if(isset($_GET['submit']) && $_GET['username']!=null){
//没有使用session来校验,而是使用的传进来的值,权限校验出现问题,这里应该跟登录态关系进行绑定
$username=escape($link, $_GET['username']);

防御,添加一步简单的验证,判断 URL 传入的 username 和当前用户是否匹配,如果匹配再赋值。

1
2
3
if($_SESSION['op']['username']==$_GET['username']){
$username=escape($link,$_GET['username']);
}
1
2
3
4
5
6
7
8
9
10
11
12
$link=connect();
// 判断是否登录,没有登录不能访问
if(!check_op_login($link)){
header("location:op1_login.php");
}
$html='';
if(isset($_GET['submit']) && $_GET['username']!=null){
//没有使用session来校验,而是使用的传进来的值,权限校验出现问题,这里应该跟登录态关系进行绑定
if($_SESSION['op']['username']==$_GET['username']){
$username=escape($link,$_GET['username']);
}
// $username=escape($link, $_GET['username']);

这时再修改 URL 中的 username 值则不再起作用。

垂直越权

20250109162606

先登录普通用户,只有查看权限。

20250109162645

管理员用户,拥有查看、添加和删除的权限。

20250109162732

1
2
3
4
5
6
查看用户列表URL
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin.php
添加用户URL
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
删除用户URL(每次删除后面的id都会变)
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin.php?id=27

在仅登录普通用户的情况下,直接访问管理员用户的查看、添加和删除的 URL ;此时发现查看和删除操作需要登录管理员账户才能操作,而添加操作直接可以实现。

分析源码,查看操作,判断用户是否登录,是否权限级别为 1(超级 boss),若有一条不满足,就跳转至登录页面。

file:op2_admin.php
1
2
3
4
5
6
7
$link=connect();
// 判断是否登录,没有登录不能访问
//如果没登录,或者level不等于1,都就干掉
if(!check_op2_login($link) || $_SESSION['op2']['level']!=1){
header("location:op2_login.php");
exit();
}

删除操作,没有验证权限级别导致了垂直越权漏洞。

file:op2_admin_edit.php
1
2
3
4
5
6
7
$link=connect();
// 判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
header("location:op2_login.php");
exit();
}

未授权访问

在攻击者没有登录或未输入密码登进行验证时,即可直接进入后台主页面;或其他不允许查看页面可直接访问和操作所产生的漏洞。

一般通过目录扫描或是修改请求参数(eg:控制用户角色的参数)。

未授权访问漏洞汇总: https://www.freebuf.com/articles/web/338459.html

挖掘和测试方式

  • 主要关注其 URL 及参数数据,找到所有和用户相关的参数和参数值提交测试;
  • 设计到 JS 中提取 URL 或数据,在放回包中提取参数名和参数值,FUZZ 技术等。