您现在的位置是:首页 >技术交流 >章节1:PHP反序列化渗透与防御网站首页技术交流
章节1:PHP反序列化渗透与防御
简介章节1:PHP反序列化渗透与防御
章节1:PHP反序列化渗透与防御
1.1-PHP类与对象
类Class
一个共享相同结构和行为的对象的集合。

对象Object
类的实例


1.2-PHP Magic函数
Magic Methods

函数作用
| 函数 | 作用 |
|---|---|
| __construct | 当一个对象创建时被调用 |
| __destruct | 当一个对象销毁时被调用 |
| __toString | 当一个对象被当作一个字符串使用 |
| __sleep | 在对象被序列化之前运行 |
| __wakeup | 在对象被反序列化之后被调用 |
| __serialize() | 对对象调用serialize()方法,PHP 7.4.0起 |
| __unserialize() | 对对象调用unserialize()方法,PHP 7.4.0起 |
| __call() | 在对象上下文中调用不可访问的方法时触发 |
| __callStatic() | 在静态上下文中调用不可访问的方法时触发 |
| __get() | 用于从不可访问的属性读取数据 |
| __set() | 用于将数据写入不可访问的属性 |
| __isset() | 在不可访问的属性上调用isset()或empty()触发 |
| __unset() | 在不可访问的属性上使用unset()触发 |
| __invoke() | 当脚本尝试将对象调用为函数时触发 |
可以了解下最后三个方法。




1.3-PHP序列化与反序列化
序列化和反序列化





其他序列化格式
json字符串 json_encode
xml字符串 wddx_serialize_value
二进制格式
字节数组



https://www.bejson.com/otherformat/xmlsort/










var_dump:打印变量的相关信息


反序列化:注意
-
如果传递的字符串不可以序列化,则返回 FALSE

-
如果对象没有预定义,反序列化得到的对象是__PHP_Incomplete_Class


作用
- 传输对象
- 用作缓存(Cookie、Session)
反序列化与Magic函数
__wakeup
__unserialize() (PHP 7.4.0)
如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法,则只有 __unserialize() 方法会生效,__wakeup() 方法会被忽略。




1.4-反序列化漏洞的出现







反序列化漏洞
- unserialize函数的参数可控,比如通过GET请求传参(漏洞触发点)
- 脚本中定义了有Magic方法,方法里面有向php文件做读写数据或者执行命令的操作,比如__destruct()、unlink()
- 操作的内容需要有对象的成员变量的值,比如filename
常见利用函数
| 类别 | 函数 |
|---|---|
| 命令执行 | exec() passthru() popen() system() …… |
| 文件操作 | file_put_contents() file_get_contents() unlink …… |
1.5-CTF题目分析
题目地址
https://adworld.xctf.org.cn/challenges/list
类型:Web
难度:1
unserialize3









1.6-typecho反序列化漏洞
题目地址
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-18753
下载地址
https://github.com/typecho/typecho/releases/tag/v1.0-14.10.10-release
Source code(zip)
PHP版本: 5.4.5nts(PHPStudy)
在数据库新建一个库,命名为typecho



风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结