类(class)一个共享相同结构和行为的对象的集合
<?php
class myclass {
var $a;
var $b = "constant string";
}
function myfunc ($arg1, $arg2) {
[..]
}
[..]
?>
在PHP代码中,每一个类都是用class关键字开头去定义的,后面跟着类的名字。在类的代码内部,我们可以定义成员变量,这些变量定义了类的属性;同时,还可以定义函数,或者称之为方法,这些方法定义了类的动作。这样的一个结构,我们就把它叫做类。
类的实例
<?php
$baidu = new site;
$kitty = new cat;
$benz = new car;
?>
Magic函数
这是一种特殊的方法,当对对象执行某些操作时会覆盖php的默认操作
序列化与反序列化
代码运行完毕,对象消亡后,其属性和方法就无法访问。若当前存在继续使用该对象的需求,例如在另一个类中调用其变量和方法,则无法实现。此时,能否以某种形式存储该对象,并将其恢复到内存中,以便在对象消亡后继续使用,或将其发送到其他地方使用(如通过网络传输到另一台电脑)这个过程将一个对象转换成一个字符形式,我们称之为序列化。反过来,将这个字符恢复成一个对象的过程,我们称之为反序列化。
设计序列化和反序列化的主要目的是为了实现对象的传输以及跨平台的使用。例如,当需要将一个对象发送给另一台计算机,或者实现远程调用等目的时,可以将该对象进行序列化。然后让它自己去反序列化回来。
还有其它序列化格式
json字符串 json_encode
xml字符串 wddx_serialize_value
二进制格式
字节数组
注意:1 如果传递的字符串不可以序列化,则返回FALSE
2 如果对象没有预定义,反序列化得到的对象是__PHP_Incomplete_Class
序列化与反序列化的作用
1 传输对象
2 用作缓存(Cookie、Session)
反序列化漏洞发生条件
1 unserialize函数的参数可控,比如通过GET请求传参(漏洞触发点)
自己传进去一个序列化数据,序列化之后触发Magic方法
2 脚本中定义了有Magic方法,方法里面有向php文件做读写数据或执行命令的操作,比如__destruct()、unlike()
触发方法之后进行文件的读取或者删除等
3 操作的内容需要有对象的成员变量的值,比如filename
可以指定文件读取或者删除的名称
__wakeup绕过
序列化字符串中表示对象属性个数的值大于真实的属性个数时,就会跳过__wakeuo()的执行
例如将
O:4:"test":2:{s:2:"v1";s:6:"benben";s:2:"v2";s:3:"123";};
//改成
O:4:"test":3:{s:2:"v1";s:6:"benben";s:2:"v2";s:3:"123";};
有时候不让O的后面有数字,只能将O:6改为O:%2B6, 其中%2B是加号(+)的url编码要注意审计
if (preg_match('/[oc]:\d+:/i',$cmd)){
echo "Are you daydreaming?";
如果是text中有一个私有成员则加上%00
O:4:"test":3:{s:8:"%00text%00v1";s:6:"benben";s:2:"v2";s:3:"123";};