反序列化在很多语言中都比较常见,下面简单介绍php的反序列化漏洞(对象注入)。
0x00.是什么
——what
php反序列化漏洞,又叫对象注入。
涉及到的是php中的两个函数:unsearialize()与serialize()。后者为将一个对象或者数组转换为字符串以便保存,前者则将尝试将字符串恢复为对象或者数组。
关于这个漏洞大家平时可能很少见,它的触发点主要是在代码审计中cms的session序列化与反序列化和ctf中相关反序列化字符串的构建。
执行方式是通过自动执行的魔术方法构造pop链,然后执行危险函数造成漏洞的产生。
0x01.为什么
——why
总结了一下整个流程:
unserialize()函数的参数可控 => 实例化类 => 魔术方法自动调用 => 危险函数执行
1.魔术方法
魔术方法,magic method。魔术方法有各自的属性,类、对象进行各种操作时会自动调用。
常见的魔术方法如下:
魔术方法
属性
__construct()
构造函数,实例化对类时自动调用
__destruct()
析构函数,销毁对象时自动调用
__sleep()
序列化对象时自动调用
__wakeup()
反序列化对象时自动调用
__toString()
echo输出对象时自动调用
2.构造payload
定义一个测试类如下:
构造payload方法1:
构造payload方法2(推荐):
3.口算payload
示例:
0x02.怎么做
——how
1.一些值得看一看的例子
cms漏洞:
ctf题目:
2.CVE-2016-7124
序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
例子:
3.Session反序列化
session.serialize_handler(php反序列化处理器):
使用方法:
关于这部分,有如下参考:
整个流程为:
反序列化与序列化处理器不同 =>
使用php_serialize处理器序列化,值中含有| =>
使用php处理器反序列化,格式为”键名|serialize()处理后的值” =>
|前解析为键名,|后进行反序列化
0x03.其他
本文转载自grt1st的博客
点击“阅读全文”,查看详情