章节1:PHP反序列化渗透与防御
1.1-PHP类与对象
类Class
一个共享相同结构和行为的对象的集合。
对象Object
类的实例
1.2-PHP Magic函数
Magic Methods
https://www.php.net/__sleep
函数作用
函数 | 作用 |
---|---|
__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