Webug4.0靶场通关笔记20- 第25关越权查看admin

目录

一、越权原理

1. 水平越权

2. 垂直越权

二、第25关 越权查看admin

1.打开靶场

2.源码分析

(1)为何存在越权?

(2)如何利用越权?

3.源码修改

4.aaaaa账号登录

5.水平越权切换到mooyuan

6.垂直越权切换admin


本文通过《webug4靶场第25关 越权查看admin》来进行越权攻击渗透实战。

一、越权原理

本关卡虽然题目是越权查看admin也就是垂直越权,实际上也存在水平越权。

1. 水平越权

  • 定义:指相同权限级别的用户之间,非法访问或操作其他用户的资源。即攻击者尝试访问与自己具有相同权限级别的其他用户的信息或执行相关操作,而这些操作超出了其应有的访问范围。
  • 原理:Web 应用程序在处理用户请求时,通常依据用户的身份标识(如用户 ID)来识别和授权访问相应的资源。当应用程序对用户输入的参数(如 URL 中的用户 ID、表单中的数据等)没有进行充分的验证和过滤时,攻击者就可以通过修改这些参数,将目标用户的身份标识替换为自己的,从而访问到其他用户的资源。
  • 示例:在一个在线银行系统中,用户 A 和用户 B 都是普通客户,具有相同的权限。用户 A 通过修改 URL 中的用户 ID 参数,将其从自己的 ID 改为用户 B 的 ID,从而成功访问到了用户 B 的账户信息,如余额、交易记录等。

2. 垂直越权

  • 定义:指低权限用户非法访问或操作高权限用户的资源或执行高权限操作。即攻击者突破自身权限限制,访问到本应只有更高权限角色才能访问的功能或数据。
  • 原理:应用程序在进行权限验证时,可能存在不严格或不完整的情况。例如,仅验证用户是否登录,而没有对用户的具体角色和权限进行细致的检查。或者在权限判断过程中,存在逻辑处理不当,使得低权限用户能够绕过正常的权限控制,直接访问高权限的资源或执行高权限的操作。
  • 示例:在一个企业管理系统中,普通员工账户通常只能查看自己的考勤记录和个人信息。但通过分析应用程序的访问逻辑,攻击者发现可以直接在 URL 中输入特定的参数,绕过权限验证,访问到管理员页面,进而对系统中的所有员工信息进行修改、删除等操作。

二、第25关 越权查看admin

1.打开靶场

 点进去第25关越权关卡,进入到如下界面。

http://192.168.71.1/webug4/control/auth_cross/cross_find.php

2.源码分析

cross_find.php源码如下所示。

<?php

require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}

if (isset($_POST['username']) && isset($_POST['password'])) {
    if (!empty($_POST['username']) && !empty($_POST['password'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $sql = "SELECT id, username, password FROM user_test WHERE username = '{$username}' AND password = '{$password}'";
        $res = $dbConnect->query($sql);
        while ($row = mysqli_fetch_assoc($res)) {
            $id = $row['id'];
            header("Location:/pt_env/control/auth_cross/cross_find2.php?id={$id}");
        }
    }
}
require_once TPMELATE."/cross_auth_passwd.html";

cross_find.php中在登录成功后跳转到的cross_find2.php源码这个代码的含义为基于id查询用户信息,显示当前是哪个用户。 并没有判断当前用户是否为该id,存在越权攻击的可能性,如下所示。

require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}
// 检查是否存在id参数
if (isset($_GET['id'])) {
    // 检查id参数是否非空
    if (!empty($_GET['id'])) {
        // 直接获取用户输入的id参数(未做任何过滤处理)
        $id = $_GET['id'];
        
        // 构造SQL查询语句(直接将用户输入拼接到SQL中,极其危险)
        $sql = "SELECT id, username, password FROM user_test WHERE id = {$id}";
        
        // 执行SQL查询
        $res = $dbConnect->query($sql);
        
        // 遍历查询结果
        while ($row = mysqli_fetch_assoc($res)) {
            // 输出用户名(存在XSS风险)
            $user = $row['username'];
            echo "I am :{$user}";
        }
    }
}

接下来对 cross_find.php源代码进行详细注释并分析,如下所示。 


// 检查是否通过 POST 方法提交了 'username' 和 'password' 字段
if (isset($_POST['username']) && isset($_POST['password'])) {
    // 检查 'username' 和 'password' 字段是否不为空
    if (!empty($_POST['username']) && !empty($_POST['password'])) {
        // 获取 POST 方法提交的 'username' 字段的值
        $username = $_POST['username'];
        // 获取 POST 方法提交的 'password' 字段的值
        $password = $_POST['password'];
        // 构造 SQL 查询语句,用于从 'user_test' 表中查询匹配的用户名和密码的记录
        $sql = "SELECT id, username, password FROM user_test WHERE username = '{$username}' AND password = '{$password}'";
        // 执行 SQL 查询语句,并将结果存储在 $res 变量中
        $res = $dbConnect->query($sql);
        // 遍历查询结果集
        while ($row = mysqli_fetch_assoc($res)) {
            // 从结果集中获取用户的 id
            $id = $row['id'];
            // 将用户重定向到 cross_find2.php 页面,并将用户的 id 作为参数传递
            header("Location:cross_find2.php?id={$id}");
        }
    }
}

(1)为何存在越权?

  • 缺乏权限验证:代码仅验证了用户名和密码,在用户登录成功后,直接将用户重定向到 cross_find2.php 页面,并传递用户的 id 参数,没有对用户是否具有访问该页面或执行特定操作的权限进行检查。不同用户角色通常具有不同的权限级别,例如普通用户和管理员用户,而代码没有区分这些角色,只要用户登录成功,就可以访问该页面,这就为垂直越权攻击提供了可能。
  • 依赖用户 ID 传递:页面的访问依赖于 id 参数,攻击者可以通过修改这个参数的值来尝试访问其他用户的资源或执行高权限操作。由于代码没有对 id 参数进行严格的权限验证,攻击者可以轻易绕过正常的权限控制。

(2)如何利用越权?

  • 假设场景:由于代码存在越权漏_洞,攻击者可以通过以下方式利用:
    • 修改 URL 参数:攻击者在登录自己的账号后,获取到自己的id 参数,然后手动修改 URL 中的 id 参数为管理员用户的 id或者其他用户id,再次访问 cross_find2.php 页面。由于代码没有对 id参数进行权限验证,攻击者就可以以管理员的身份访问该页面,执行只有管理员才能执行的操作,如删除用户、修改系统配置等。

3.源码修改

  使用用户名admin和密码admin登录。

登陆后报错如下,很明显是网址访问错误。

很明显URL链接地址出现错误,应该如下所示。

http://192.168.71.1/control/auth_cross/cross_find2.php?id=1

于是需要将源码修改为如下内容。

<?php

require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}

if (isset($_POST['username']) && isset($_POST['password'])) {
    if (!empty($_POST['username']) && !empty($_POST['password'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $sql = "SELECT id, username, password FROM user_test WHERE username = '{$username}' AND password = '{$password}'";
        $res = $dbConnect->query($sql);
        while ($row = mysqli_fetch_assoc($res)) {
            $id = $row['id'];
            header("Location:cross_find2.php?id={$id}");
        }
    }
}
require_once TPMELATE."/cross_auth_passwd.html";


这个代码bug在docker版本的靶场中也存在,需要同样修改。

再次使用用户名admin和密码admin登录,如下所示。

4.aaaaa账号登录

进入正确的页面后,输入aaaaa用户名和密码点击GO登录。

http://192.168.71.1/webug4/control/auth_cross/cross_find2.php?id=2

如下所示登录成功提示我是aaaa。

5.水平越权切换到mooyuan

在aaaaa用户登录的前提下,直接将id修改为3,如下所示水平越权成功。

http://127.0.0.1//webug4/control/auth_cross/cross_find2.php?id=3

6.垂直越权切换admin

在mooyuan用户登录的前提下,直接将id修改为1,如下所示垂直越权成功。

http://192.168.71.1/webug4/control/auth_cross/cross_find2.php?id=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值