当前位置: 首页 > news >正文

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源码如下所示。

<?phprequire_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

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

<?phprequire_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

http://www.xdnf.cn/news/328231.html

相关文章:

  • 读《暗时间》有感
  • 基于RT-Thread的STM32G4开发第二讲第二篇——ADC
  • 2014年写的一个文档《基于大数据应用的综合健康服务平台研发及应用示范》
  • layui下拉框输入关键字才出数据
  • JMeter快速指南:命令行生成HTML测试报告(附样例命令解析)
  • Android学习总结之网络篇补充
  • conda init before conda activate
  • MVC是什么?分别对应SpringBoot哪些层?
  • 【C/C++】ARM处理器对齐_伪共享问题
  • autojs和冰狐智能辅助该怎么选择?
  • 从D盘分配空间为C盘扩容?利用工具1+1>2
  • 使用JMeter 编写的测试计划的多个线程组如何生成独立的线程组报告
  • 理解文本嵌入:语义空间之旅
  • 探索 H-ZERO 模态框组件:提升用户交互体验的利器
  • PaaS筑基,中国中化实现转型飞跃
  • ROS1和ROS2使用桥接工具通信
  • 【CF】Day53——Codeforces Round 1023 (Div. 2) CD
  • 中级网络工程师知识点1
  • 自定义分区器-基础
  • 【useOperatorData Hook 改造实践】
  • 7D-AI系列:模型微调之mlx-lm
  • Node.js 的 child_process 模块详解
  • Inference-Time Scaling for Generalist Reward Modeling
  • 课程10. Transformers与大型语言模型
  • css内容省略——text-overflow: ellipsis
  • RDD的基本概念及创建方式
  • 什么是RDD.RDD的创建方式
  • 小王包子铺的融资过程以及IPO上市过程
  • 自定义Widget开发:手势交互处理
  • cuda程序兼容性问题