目录
php反序列化
什么是反序列化?
序列化就是将一个对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。反序列化则相反将字符串重新恢复成对象
serialize() 序列化
unserialize() 反序列化
漏洞原理:
PHP将所有以__ (两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以__为前缀。
常见的魔术方法:
- __construct()当以个对象创建时被调用
- __destruct()当一个对象销毁时被调用
- __toString()当一个对象被当作一个字符串使用
- __sleep() 在对象在被序列化之前运行
- __wakeup将在序列化之后立即被调用
PHP类中的特殊属性
序列化为了能把整个类对象的各种信息完完整整的压缩,格式化,也会将属性的权限序列化进去。但不同类型的属性会有不同的格式
1. Public 权限
可以内部调用,实例调用等
2. Private权限 ( test flag)反序列化时会多两个空字节00==>可以传递%00test%00flag进行反序列化
被private修饰的只能是同一个类的可以访问
3. Protected权限 ( * test)同样多了两个空字节==>%00*%00test进行反序列化
对继承的类开放,没继承的类不开放
Phar反序列化概要
除了unserialize()来利用反序列化漏洞之外,还可以利用phar文件以序列化的形式存储用户自定义的meta-data这一特性,扩大php反序列化漏洞的攻击面。该方法在文件系统函数(file__exists()、 is__dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。
来自Secarma的安全研究员Sam Thomas发现了-种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞。这个新的攻击方式被他公开在了美国的BlackHat会议演讲上,演讲主题为:”不为人所知的php反序列化漏洞”。它可以使攻击者将相关漏洞的严重程度升级为远程代码执行。我们在RIPS代码分析引擎中添加了对这种新型攻击的检测。
因此可以构造一个恶意的phar包,使得代码能够被反序列化,在使用phar://协议读取文件时,文件会被