浅析pop链的构造利用和实战
以前总是认为这类的题目,自己写题的话,是可以的,但是最近看到网上有一些讲解pop的;所以也来补上一篇;
魔术方法
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic()
//在静态上下文中调用不可访问的方法时触发
__get()
//用于从不可访问的属性读取数据
__set()
//用于将数据写入不可访问的属性
__isset()
//在不可访问的属性上调用isset()或empty()触发
__unset()
//在不可访问的属性上使用unset()时触发
__toString()
//把类当作字符串使用时触发
__invoke()
//当脚本尝试将对象调用为函数时触发
一般来说我们构造的pop链是需要进行利用魔法函数来触发相应的危险函数进行的;这里主要就是要理清楚pop链,这里需要对php知识有一定的了解;
首先在我vps上搭建一个环境,在本地访问;代码如下,我们可以利用这个代码来执行命令;
这里我们可以看到s1mple类本来是来调用hacker类的,但是这里因为有同样的action()方法,所以我们可以篡改将其调用为evil从而来调用evil()类;进行命令执行;我们执行phpinfo();
exp如下
攻击效果
实战
下面拿着一个可以很清楚反应问题的例子来进行讲解;远程搭建一个环境;
局部分析代码;
我们可以发现有个危险函数file_get_contents();这个函数可以读取内容;然而我们发现想要调用这个函数需要先来调用file_get() 方法;调用file_get()方法就需要调用__invoke()方法,这个方法之前介绍过;是脚本尝试将对象调用为函数的时候触发的;
然后我们看到 Test类中有__get()
方法,对应的就是自定义一个函数;这里就是契机,我们可以将其赋值为一个类;这样就可以调用到 __invoke()
方法了;现在问题就是如何调用__get()
方法的问题;我们看到Show类中
我们了解__get()
方法是当我们在读取我们不可访问的数据或者不存在的数据时进行调用,那么这里我们就可以将source赋值为一个不存在的数据,就可以触发__get()
方法;现在的问题就又到了如何调用__toString()
方法,这里我们可以看到刚开始会进行反序列化,这就调用了__wakeup()
方法,如果我们将这个source赋值为一个类,preg_match是用字符串来进行匹配的;那么preg_match就是将一个类当作字符串来进行匹配,所以直接就调用了__toString()
方法;
那么我们的思路就清晰了;
file_get ->__incoke()
->__get()
-> __toString()
上exp: