全局变量(PHP)(小迪网络安全笔记~

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!
附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!

1.1 🐘全局变量(PHP)

  1. 引子:从本章开始,正式进入Web开发篇,当然文章所写内容并非如何从零开始成为一名合格的开发者,而是站在安全的角度学开发。再说白点,就是开发者在开发业务系统时,哪处容易出现安全问题就学哪处。本章则从PHP基础之全局变量开始。

  2. $GLOBALS
    $GLOBALS全局变量,为PHP内置的全局数组,存储了当前脚本所有的全局作用域变量。(其中,全局作用域变量指在函数外部所定义的变量,可在整个脚本中被访问,不过在函数内部默认无法访问。)
    demo:

    <?php
    $x = 1;
    $y = 2;
    $z = 19;
    function add()
    {
        # $z = $x + $y;
        # 由于x,y,z定义在函数外,无法直接调用,
        # 此时$GLOBALS全局变量的作用就体现出来了,
        # 可通过$GLOBALS全局数组实现对x,y,z变量的访问和更改
        $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
    }
    
    add();
    echo "z的值为" . $z;
    # RES: z的值为3
    # 综上所述,通过部分全局变量可实现对于原本无法直接访问变量的调用与修改。
    
  3. $_GET & $_POST & $_REQUEST
    $_GET全局变量用于获取Http请求包中请求方法为get的数据, $_POST全局变量用于获取请求方式为post的数据,$_REQUEST可同时接收来自get&post的数据。
    demo:

    <?php
    echo "接收到GET请求包的值为:" . $_GET['x'] . '<hr>';
    # http://192.168.2.106:81/global/GlobalDemo2.php?x=19
    # RES: 接收到GET请求包的值为:19
    
    echo "接收到POST请求包的值为:" . $_POST['y'] . '<hr>';
    # http://192.168.2.106:81/global/GlobalDemo2.php?x=19
    # body: y=19
    # RES: 接收到POST请求包的值为:19
    
    echo "接收到GET/POST请求包的值为:" . $_REQUEST['z'];
    # http://192.168.2.106:81/global/GlobalDemo2.php?x=19&z=19
    # body: y=19
    # RES: 接收到GET/POST请求包的值为:19
    # http://192.168.2.106:81/global/GlobalDemo2.php?x=19
    # body: y=19&z=19
    # RES: 接收到GET/POST请求包的值为:19
    
  4. $_COOKIE & $_SESSION
    用于访问&存储Cookie&Session值信息。
    demo1:

    <?php
    // 获取用户名和密码
    $username = $_POST['username'];
    $password = $_POST['password'];
    // 保存为 Cookie
    setcookie('username', $username, time() + 86400, '/');
    setcookie('password', $password, time() + 86400, '/');
    // 其中 'username' & 'password' 为Cookie Name
    // $username & $password 为Cookie Value
    // time() + 86400 为Cookie有效期,即从当前开始持续24小时
    // '/' 为Cookie生效范围,'/'即为用户访问该网站任意路径都会携带Cookie
    
    echo "Cookie中的username值为:" . $_COOKIE['username'] . '<hr>';
    echo "Cookie中的password值为:" . $_COOKIE['password'] . '<hr>';
    // RES:Cookie中的username值为:test
    //     Cookie中的password值为:test
    

    demo2:

    <?php
    // 启动会话
    session_start();
    
    // 获取用户名和密码
    $username = $_POST['username'];
    $password = $_POST['password'];
    // 将用户名和密码保存到Session中
    $_SESSION['username'] = $username;
    $_SESSION['password'] = $password;
    
    echo '生成的Session ID为:' . session_id() . '<hr>';
    // 生成的Session ID为:q738a9r9i2knp06ctb08gtu16b
    echo "Session中的username值为:" . $_SESSION['username'] . '<hr>';
    // Session中的username值为:test
    

    由于Session的设计原理,生成Session后会返回给客户端一个Session ID,待客户端下次访问时会携带该Session ID且与存储于服务端的Session文件名(文件名即为Session ID)比较,若文件存在则证明该用户身份正确。需要注意的是,Session ID默认会在浏览器关闭后失效。
    因此我们可以根据Session ID尝试寻找被存储的Session文件并查看其文件内容:
    image-20250106154314115

  5. $_Files
    该全局变量访问&存储经POST方法上传的文件信息,如文件名、MIME类型、文件大小等信息。
    什么是MIME类型?
    MIME:Multipurpose Internet Mail Extensions,也称媒体类型,为互联网通信中表示文件内容的类型。最初于电子邮件系统中被用于对不同类型文件的正确接收&发送,后被广泛应用至Http等网络协议中。
    demo:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>文件上传</title>
    </head>
    <body>
        <h2>文件上传表单</h2>
        <form action="GlobalDemo5.php" method="post" enctype="multipart/form-data">
            <label for="file">选择文件:</label>
            <input type="file" name="file" id="file" required><br><br>
            <button type="submit">上传文件</button>
        </form>
    </body>
    </html>
    
    <?php
    echo '<br>';
    echo "被上传文件的临时存储路径为:".$_FILES['file']['tmp_name'].'<hr>';
    echo "被上传文件名为:".$_FILES['file']['name'].'<hr>';
    echo "被上传文件大小为:".$_FILES['file']['size'].'<hr>';
    echo "被上传文件类型为:".$_FILES['file']['type'];
    // 被上传文件的临时存储路径为:C:\Windows\phpB828.tmp,
    // --> 临时路径可由php.ini中upload_tmp_dir指定,若未指定则采取系统默认
    // 被上传文件名为:1.png
    // 被上传文件大小为:376394
    // 被上传文件类型为:image/png
    
  6. $_ENV & $_SERVER
    其中$_ENV存储了系统环境变量信息,$_SERVER存储了服务器&执行环境信息。
    demo:

    <?php
    // 若想使$_ENV全局变量能访问当前系统环境变量,
    // 需在php.ini文件中启用 variables_order  Default Value: "EGPCS"
    echo "PHP脚本路径为:".$_ENV['SCRIPT_NAME'].'<hr>';
    echo "PHP配置文件路径为:".$_ENV['PHPRC'].'<hr>';
    echo "PHP运行环境为:".$_ENV['SERVER_SOFTWARE'].'<hr>';
    // PHP脚本路径为:/global/GlobalDemo6.php
    // PHP配置文件路径为:D:/Lan/IDE/Extra/PHPkaifa/phpstudy_pro/Extensions/php/php7.3.4nts
    // PHP运行环境为:Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
    
    
    echo "访问服务端的客户端UA头为:".$_SERVER['HTTP_USER_AGENT'].'<hr>';
    echo "访问服务端的客户端ip为:".$_SERVER['REMOTE_ADDR'].'<hr>';
    echo "访问服务端的客户端port为:".$_SERVER['REMOTE_PORT'].'<hr>';
    echo "服务端的ip为:".$_SERVER['SERVER_ADDR'].'<hr>';
    // 访问服务端的客户端UA头为:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
    // 访问服务端的客户端ip为:192.168.2.106
    // 访问服务端的客户端port为:63323
    // 服务端的ip为:192.168.2.106
    

    感觉下来,这两个全局变量所存储的信息内容差不多,$_ENV能访问&存储的信息,$_SERVER也可以。只不过$_ENV默认无法访问到系统环境变量信息,需在php.ini文件中开启。

  7. 实验
    好了,你已经学会php Web开发了,现在开始代码审计吧(不是。

    1. 实验案例:DuomiCms
      由于笔者比较菜(😭),因此本文的审计流程为“对着答案出题”。想了解完整代审流程可参考这位大佬的文章:https://blog.csdn.net/qq_59023242/article/details/135080259

    2. 审计目标:绕过账户&密码验证,实现后台登录。
      这里直接给出答案,也就是payload。

      /interface/comment.php?_SESSION[duomi_admin_id]=19&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=sj
      
    3. 首先分析一下这段payload,/interface/comment.php为访问路径,? 后为传递参数,该参数的含义为为全局变量_SESSION所存储内容重新赋值。
      当输入错误账户&密码后,生成的Session文件内容为:
      image-20250106215535428
      输入payload后,Session文件内容被覆盖为:
      image-20250106215731960
      再尝试缩减该payload为:

      ?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=19
      

      发现此时仍可绕过账户&密码验证,可以推测Session中duomi_group_id & duomi_admin_id的值是绕过前台登陆的关键,但又因为duomi_admin_id的值为我随意赋的,因此我们需要重点关注的仅剩duomi_group_id字段。ok,接下来看代码。

    4. 找到intereface/comment.php文件,搜索duomi_group_id发现无结果,但在文件开头发现该文件包含了common.php 与 core.class.php的脚本文件。
      image-20250106221939568

    5. 在common.php文件中仍未找到duomi_group_id,但发现了:

      <?php
      ...
      foreach(Array('_GET','_POST','_COOKIE') as $_request)
      {
      	foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
      }
      
      # 该代码将来自Http请求数据中的 键 & 值 分别存储至 $_k & $_v 变量中
      # 也就是说该文件有接收&处理用户提交数据的功能
      

      虽然得知了common.php文件具有接收&处理用户所传数据的功能,但文件中并未发现duomi_group_id,也就是说对于duomi_group_id数据的处理并不在该文件中。推测该文件可能仅是对接收数据的初步处理,更深一步的处理可能在别的且包含该文件的文件中。

    6. 全局搜索包含/common.php的文件
      image-20250106224832183
      由于后台登录路径为/admin,而我们要实现后台登录绕过,因此优先看admin目录下文件。虽然仍未找到对duomi_group_id的处理,但在/admin/config.php文件下找到了:

      <?php
      ...
      //检验用户登录状态
      $cuserLogin = new userLogin();
      if($cuserLogin->getUserID()==-1)
      {
      	header("location:login.php?gotopage=".urlencode($EkNowurl));
      	exit();
      }
      
      # 由注释可知,该代码的功能为检验用户登录状态,以及一个对所返回userid的判断
      # 但我们仍不知其所返回userid是否与duomi_group_id相关,因此追踪一下userLogin对象
      
    7. 查看duomiphp/check.admin.php文件,也就是定义userLogin对象的文件,成功找到了定义duomi_group_id的代码。
      image-20250106231226275
      并在49-54行中,发现了将keepgroupidTag(doumi_gourp_id)赋值给了groupid,也就是说传递给_SESSION[duomi_group_id]的值最终被groupid所接收,但在该check.admin.php文件中发现并未处理获取到的groupid,因此还需找处理groupid的代码。
      image-20250106232010509

    8. 全局搜索groupid,最终在/admin/admin_manager.php文件中找到对groupid的处理逻辑。
      image-20250106235559017
      也就验证了为什么payload的写法为:

      /interface/comment.php?_SESSION[duomi_admin_id]=19&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=sj
      
    9. 试验结束!

    ps:接下来如果还有类似的代审实验,笔者应该不会再记录了,因为记得有点像流水账,有很多细节我自己都不太懂,还是不误导大家了。这里还是建议有一定开发底子后再接触代审。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950323.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

耗时一天,我用AI开发了AI小程序

小码哥从事前后端开发近十年&#xff0c;但是随着技术的更新迭代&#xff0c;有时候没有时间和精力去优化UI、实现一些前后端功能&#xff0c;以及解决一些bug。特别是我想开发小码哥AI的移动端&#xff0c;但觉得自己没有那么多时间去研究移动端了&#xff0c;准备放弃了&…

细说STM32F407单片机以轮询方式读写外部SRAM的方法

目录 一、实例的功能 二、工程配置 1、KEYLED 2、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 3、FSMC &#xff08;1&#xff09; 模式设置 &#xff08;2&#xff09; Bank 1子区3参数设置 1) NOR/PSRAM control组&#xff0c;子区控制参数 2) NOR/PSRAM timi…

LLM prompt提示构造案例:语音回复内容;o1思维链

1、语音回复内容 目的&#xff1a; 语音聊天助手的prompt&#xff0c;让大模型来引导聊天内容&#xff0c;简短和友好&#xff0c;从而文字转语音时候也比较高效。 ## 角色设定与交互规则 ### 基本角色 你是用户的好朋友. 你的回答将通过逼真的文字转语音技术阅读. ### 回答规则…

【51单片机零基础-chapter3:按键:独立按键|||附带常见C语句.逻辑运算符】

将unsigned char var0;看作沟通二进制和十进制的桥梁 var是8位,初始为0000 0000; 同时可以进行十进制的运算 逻辑运算 位运算 & 按位与(有0则0) | 按位或(有1则1) ~ 按位非 ^ 按位异或(相同则1,不同为0) <<按位左移 >>按位右移 位运算符解释: 0011 1100 <&…

非一般的小数:小数的概念新解、小数分类、浮点数的存储

非一般的小数&#xff1a;小数的概念新解、小数分类、浮点数的存储 一、小数的概念二、小数的分类1&#xff0e;有限小数、无限循环小数、无限不循环小数2&#xff0e;纯小数、带小数3&#xff0e;定点数、浮点数 三、浮点数的存储 一、小数的概念 这还用解释吗&#xff1f;小…

ETCD渗透利用指南

目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3&#xff0c;不同的API结果无论是访问URL还是使用etcdctl进行通信&#xff0c;都会导致问题&#xff0c;例如使用etcdctl和v3进行通信&#xff0c;如果没有实名ETCDCTL_API3指定API版本会直接…

小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式

这一节目标是实现底部推荐商品的结构和样式&#xff0c;由于这里要求横向滚动&#xff0c;所以需要使用上节介绍的 scroll-view 功能&#xff0c;并使用 scroll-x 属性支持横向滚动&#xff0c;推荐商品区域中的每一个商品是一个单独的 view&#xff0c;每个view 中需要写三个组…

JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别

1&#xff0e;JDK、JRE、JVM三者的关系 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

十四、Vue 混入(Mixins)详解

文章目录 简介一、基本语法定义混入对象使用混入对象二、混入的数据合并数据合并规则深度合并(对象类型数据)三、混入的生命周期钩子生命周期钩子的合并规则利用生命周期钩子合并的优势四、混入的方法合并方法合并规则调用被覆盖的方法(高级用法)五、混入的应用场景多个组件…

简洁安装配置在Windows环境下使用vscode开发pytorch

简洁安装配置在Windows环境下使用vscode开发pytorch 使用anaconda安装pytorch&#xff0c;通过vscode集成环境开发pytorch 下载 anaconda 下载网址&#xff0c;选择对应系统的版本 https://repo.anaconda.com/archive/ windows可以选择Anaconda3-2024.10-1-Windows-x86_64.e…

【Linux】IP地址、主机名、网络传输、进程管理、主机状态

一、IP地址 1.1 ifconfig 命令 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯IP地址主要有2个版本&#xff0c;V4版本和V6版本IPv4版本的地址格式是&#xff1a;a.b.c.d&#xff0c;其中abcd表示0~255的数字&#xff0c;如192.168.88.101就是一个标准…

2.STM32F407ZGT6-外部中断

参考&#xff1a; 1.正点原子。 前言&#xff1a; MCU最重要的一个领域–中断。总结下嵌套向量和外部中断的概念。达到&#xff1a; 1.NVIC是什么&#xff0c;了解中断的整体管理理念。 2.中断里面最简单的外部中断&#xff0c;怎么配置处理。 3.使用STM32CubeMX配置外部中断的…

基于Elasticsearch8的向量检索实现相似图形搜索

Elasticsearch8版本增加了KNN向量检索&#xff0c;可以基于此功能实现以图搜图功能。 1、首先创建索引&#xff0c;es提供了类型为dense_vector的字段&#xff0c;用于存储向量&#xff0c;其中dims是向量维度&#xff0c;可以不配置&#xff0c;es会根据第一条插入的向量维度…

Element-plus表单总结

表单包含输入框&#xff0c;单选框&#xff0c;下拉选择&#xff0c;多选框等用户输入的组件。输入表单&#xff0c;您可以收集、验证和提交数据。 经典表单 最基础的表单包括各种输入表单项&#xff0c;比如input、select、radio、checkbox等。 在每一个form组件中&#xff0…

cursor vip

https://cursor.jeter.eu.org?pf7f4f3fab0af4119bece19ff4a4360c3 可以直接复制命令使用git bash执行即可 命令&#xff1a; bash <(curl -Lk https://gitee.com/kingparks/cursor-vip/releases/download/latest/ic.sh) f7f4f3fab0af4119bece19ff4a4360c3 等待执行完成后…

创建springboot项目

目录 1、使用 https://start.spring.io/ 创建项目Project 选 mavenLanguage 选 javaSpring Boot 选 3.4.1Project MetadataDependencies 2、阿里云网址 更好用 https://start.aliyun.com/ 1、使用 https://start.spring.io/ 创建项目 跳转 Project 选 maven Language 选 jav…

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…

Netron可视化深度学习的模型框架,大大降低了大模型的学习门槛

深度学习是机器学习的一个子领域&#xff0c;灵感来源于人脑的神经网络。深度学习通过多层神经网络自动提取数据中的高级特征&#xff0c;能够处理复杂和大量的数据&#xff0c;尤其在图像、语音、自然语言处理等任务中表现出色。常见的深度学习模型&#xff1a; 卷积神经网络…

Python生成高级圣诞树-代码案例剖析

文章目录 &#x1f47d;发现宝藏 ❄️方块圣诞树&#x1f42c;效果截图&#x1f338;代码-可直接运行&#x1f334;代码解析 ❄️线条圣诞树&#x1f42c;效果截图&#x1f338;代码-可直接运行&#x1f334;代码解析 ❄️豪华圣诞树&#x1f42c;效果截图&#x1f338;代码-可…

Flux“炼丹炉”——fluxgym安装教程

一、介绍 这个炼丹炉目前可以训练除了flux-dev之外的其它模型&#xff0c;只需更改一个配置文件内容即可。重要的是训练时不需要提前进行图片裁剪、打标等前置工作&#xff0c;只需下图的三个步骤即可开始训练。它就是——fluxgym。 fluxgym&#xff1a;用于训练具有低 VRAM &…