PHP反序列化总结

(反)序列化给我们传递对象提供了一种简单的方法。serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象,在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等

常见的PHP魔术方法:

__construct: 在创建对象时候初始化对象,一般用于对变量赋初值。
__destruct: 和构造函数相反,当对象所在函数调用完毕后执行。
__toString:当对象被当做一个字符串使用时调用。
__sleep:序列化对象之前就调用此方法(其返回需要一个数组)
__wakeup:反序列化恢复对象之前调用该方法
__call:当调用对象中不存在的方法会自动调用该方法。
__get:在调用私有属性的时候会自动执行
__isset()在不可访问的属性上调用isset()或empty()触发
__unset()在不可访问的属性上使用unset()时触发

php序列化初级到高级
https://www.cnblogs.com/fish-pompom/p/11126473.html
php反序列化于POP链
https://www.cnblogs.com/tr1ple/p/11156279.html

Typecho install.php 反序列化导致任意代码执行
php反序列化漏洞绕过魔术方法 __wakeup



BUUctf题:[0CTF 2016]piapiapia

一、涉及知识点
    1、数组绕过正则及相关
    2、改变序列化字符串长度导致反序列化漏洞
二、解题方法

1、数组绕过正则及相关
参考利用数组绕过问题小总结

md5(Array()) = null
sha1(Array()) = null
ereg(pattern,Array()) =null
preg_match(pattern,Array()) = false
strcmp(Array(), “abc”) = null
strpos(Array(),“abc”) = null
strlen(Array()) = null

PS: multipart/form-data方式传递数组
在这里插入图片描述

2、改变序列化字符串长度导致反序列化漏洞

  • unserialize()会忽略能够正常序列化的字符串后面的字符串

a:4:{s:5:"phone";s:11:"13587819970";s:5:"email";s:32:"[email protected]";s:8:"nickname";s:10:"12345hacke";s:5:"photo";s:10:"config.php";}s:39:"upload/f47454d1d3644127f42070181a8b9afc";}
反序列化会正常解析,
a:4:{s:5:"phone";s:11:"13587819970";s:5:"email";s:32:"[email protected]";s:8:"nickname";s:10:"12345hacke";s:5:"photo";s:10:"config.php";}
而忽略s:39:"upload/f47454d1d3644127f42070181a8b9afc";},从而导致读取config.php

  • 可以利用这个规则构造字符串来闭合,如本题中filter()将where替换成hacker,就可以将这个成员的最后一个字符挤出去,重复34次就可以挤出34个字符,正好闭合改序列化字符串

二、解题方法
参考链接,有详细过程
https://blog.csdn.net/zz_Caleb/article/details/96777110

猜你喜欢

转载自blog.csdn.net/qq_42812036/article/details/104273421