一、 基础知识
1、什么是反序列化漏洞:
程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,通过在参数中注入一些代码,从而达到代码执行,SQL 注入,目录遍历等不可控后果,危害较大。
序列化就是将对象object、字符串string、数组array、变量,转换成具有一定格式的字符串,使其能在文件储存或传输的过程中保持稳定的格式。
当变量是私有或受保护的属性时
-
类中成员属性:
- public(公共的):在本类内部、外部类、子类都可以访问
- protect(受保护的):只有本类或子类或父类中可以访问
- private(私有的):只有本类内部可以使用
- private属性序列化的时候格式是%00类名%00成员名
- protect属性序列化的时候格式是%00*%00成员名
%00为空白符,空字符也有长度,一个空字符长度为 1,%00 虽然不会显示,但是提交还是要加上去。
魔术方法
1、常见方法:
当一个class类被创建时会引用很多PHP内置的魔术方法 __construct(): //构造函数,当对象new的时候会自动调用 __destruct()://析构函数当对象被销毁时会被自动调用 __wakeup(): //unserialize()时会被自动调用 __invoke(): //当尝试以调用函数的方法调用一个对象时,会被自动调用 __call(): //在对象上下文中调用不可访问的方法时触发 __callStatci(): //在静态上下文中调用不可访问的方法时触发 __get(): //用于从不可访问的属性读取数据 __set(): //用于将数据写入不可访问的属性 __isset(): //在不可访问的属性上调用isset()或empty()触发 __unset(): //在不可访问的属性上使用unset()时触发 __toString(): //把类当作字符串使用时触发 __sleep(): //serialize()函数会检查类中是否存在一个魔术方法__sleep() 如果存在,该方法会被优先调用
生成当前环境的原生类:使用脚本
<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
$methods = get_class_methods($class);
foreach ($methods as $method) {
if (in_array($method, array(
'__destruct',
'__toString',
'__wakeup',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__invoke',
'__set_state'
))) {
print $class . '::' . $method . "\n";
}
}
}