Php Unserialize
序列化
1 | class S{ |
private
和protected
详解PHP序列化的时候 private 和 protected 变量会引入不可见字符%00,
%00类名%00属性名
为private,%00*%00属性名
为protected,注意这两个 %00就是 ascii 码为0 的字符。这个字符显示和输出可能看不到,甚至导致截断,但是url编码后就可以看得清楚.我们可以将序列化的字符用urlencode编码之后,打印出来查看。
魔术方法
方法 | 触发条件 | 参数 | 返回值 | |
---|---|---|---|---|
__construct | 实例化对象 | |||
__destruct | 反序列化之后 销毁之后 | |||
__sleep | 序列化之前 | 需要被序列化的成员属性 | ||
__wakeup | 反序列化之前 | |||
__toString | 把对象当成字符串使用 | |||
__invoke | 把对象当成函数调用 | |||
__clone | 当使用clone关键字拷贝完一个对象 | |||
__call | 调用不存在的方法或者私有的属性 | $arg1,$arg2 | 不存在的方法名称&参数 | |
__callStatic | 静态调用不存在的方法 | $arg1,$arg2 | 不存在的方法名称&参数 | |
__get | 调用成员属性不存在 | $arg1 | 不存在的成员属性名称 | |
__set | 给不存在的成员属性赋值 | $arg1,$arg2 | 不存在的成员名称&值 | |
__isset | 对不可访问属性使用isset()或empty | $arg1 | 不存在的成员属性名称 | |
__unset | 对不可访问属性使用unset() | $arg1 | 不存在的成员属性名称 |
__wakeup()
函数漏洞绕过原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就不会执行
反序列化逃逸
str_replace — 子字符串替换
str_replace(
array|string$search
,
array|string$replace
,
string|array$subject
,
int&$count
=null
): string|array
search
查找的目标值,也就是 needle,一个数组可以指定多个目标。
replace
search
的替换值,一个数组可以被用来指定多重替换
subject
执行替换的数组或者字符串。也就是 haystack
如果
subject
是一个数组,替换操作将遍历整个subject
,返回值也将是一个数组。
count
如果被指定,它的值将被设置为替换发生的次数
返回值
该函数返回替换后的数组或者字符串。