想我一个月之前还说的要日更php反序化的知识的,结果第三章鸽了两天,这第四章倒好,直接鸽一个月。中间因为学的太慢去搞别的方向了,现在终于有了时间来整治这x蛋的php反序化链了。

---------------------------------------------------------------------------------------------------------------------------------
引子
现在CTF一般都会考反序化题目,熟练掌握反序化漏洞,不至于每次都被剃光头(哈哈)
之前我们讲了一道反序化题目,通过绕过一些函数,从而进入了服务器规定之外的页面。
(日更)PHP反序化漏洞解析(3) 漏洞利用条件及利用实例 XCTFWeb_php_unserialize_AAAAAAAAAAAA66的博客-CSDN博客e
这道题目是利用了序列化和反序化过程中会自动调用魔法函数,我们通过绕过wake up魔法函数,执行了我们想要执行的代码。
为什么要提到这里呢?
因为今天要说的反序化链与这道题目不同的是,反序化链是通过调用其中的魔法函数,改变程序原来运行的运行顺序,从而执行我们需要执行的代码。而这道题目是绕过。
目录
反序化链的挖掘
反序列化漏洞一般都是在白盒审计时发现并利用,需要构造PHP序列化代码,利用条件比较苛刻。
首先进行反序列化的数据点是用户可控的,然后反序列化类中需要有魔术方法,魔术方法中存在敏感操作,或者魔术方法中无敏感操作,但是其对象调用了其他类中的同名函数,可以通过构造POP链利用。
反序化链原理
通过寻找程序当前环境中已经定义了或者能够动态加载的对象中的属性(函数方法),将一些可能的调用组合在一起形成一个完整的、具有目的性的操作。
自己的思考:通俗点来讲,相当于缓存区溢出漏洞,改变了设计者想要让我们执行的程序顺序。在PHP中,这些方便程序运行的魔法函数,及相对‘宽松’的调用函数过程,是反序化链漏洞的成因,当然这可以说是天生的,毕竟语言设计之初的初衷是为了更方便的使用和更好的运行性能。 (个人思考,不对的欢迎指正)
实例
讲了这么多,我们可以看实例了,重点有2个。
- 魔法函数,在什么时候会调用(这些魔法函数-对于刚接触php,或是没学过php的小白,只要稍微有一点语言基础)
- 这些函数串接的过程和顺序,要怎么构造,衔接。
__construct()//创建对象时触发 __destruct() //对象被销毁时触发 __wakeup() 使用unserialize时触发 __toString 当一个对象被当作一个字符串被调用 __call() //在对象上下文中调用不可访问的方法时触发 __callStatic() //在静态上下文中调用不可访问的方法时触发 __get() //用于从不可访问的属性读取数据 __set() //用于将数据写入不可访问的属性 __isset() //在不可访问的属性上调用isset()或empty()触发 __unset() //在不可访问的属性上使用unset()时触发 __invoke() //当脚本尝试将对象调用为函数时触发
[MRCTF2020]Ezpop
BUUCTF在线评测 ←平台

源码给出,要我们去审计()教学网站都给了,但是我进了一下好像进不去?不过可以看大神的write up。嘿嘿
我自己重新审计了一下代码
Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F

本文深入剖析PHP反序化链的挖掘与原理,通过[MRCTF2020]Ezpop题目的详细解题过程,展示了如何利用魔法函数构造反序化链以达到目标。适合对PHP安全感兴趣的读者。
PHP反序化漏洞解析(4) 简单pop反序化链的构造 通过魔法函数学习过程 MRCTF2020Ezpop 详细复现过程&spm=1001.2101.3001.5002&articleId=122093620&d=1&t=3&u=9ad5924ecda4447087283b46da5cf01f)
1568

被折叠的 条评论
为什么被折叠?



