PHP反序列化总结

学习了php的反序列化,在这里总结一下各种利用姿势,如果后期出现新的姿势会在本篇不定时更新。
反序列化漏洞的成因就是因为序列化的内容可控,unserialize反序列化时执行了用户构造的恶意代码。
而在利用反序列化漏洞时,一条清晰完整的POP链很重要。

一、魔术方法

反序列化漏洞成功利用的必要条件之一就是代码中存在可调用的魔术方法。下面列出PHP中一些常见的魔术方法,具体可查阅官方文档。

1
2
3
4
5
6
7
8
9
10
__construct(), __destruct()
__call(), __callStatic()
__get(), __set()
__isset(), __unset()
__sleep(), __wakeup()
__toString()
__invoke()
__set_state()
__clone()
__debugInfo()

在复现漏洞及做ctf题目时遇到了destruct(),get(),set(),tostring(),wakeup(),其他的暂时没有遇到。

二、可利用的POP链

除了魔术方法是必要的条件外,一条完整可利用的POP链同样是必要的。例如前面写过的文章,typecho的反序列化漏洞的POP链。
个人感觉构造一条可利用的POP链需要清晰的思路以及丰富的经验,由于本人在代码审计方面还是个新手,所以这里不过多记录。

三、反序列化漏洞利用的场景

1.简单的反序列化
一些简单的基础的反序列化导致的漏洞,就不多费口舌了,原理以及例子网上到处都是。只需要熟悉PHP的魔术方法,利用反序列化操作来触发即可。
下面重点记录自己学习的session反序列化漏洞及phar导致的反序列化漏洞,以加深印象巩固知识。
2.session反序列化漏洞
php会将用户的session序列化后并保存为文件,文件名为sess_+PHPSESSID的值,用户访问页面的时候会读取内容,php自动反序列化数据并且填充$_SESSION超全局变。session的反序列化本身并没有什么问题,但是当序列化/反序列化时所用的处理器不同,将会导致漏洞产生。
php中进行序列化操作的处理器有:

1
2
3
php_binary
php
php_serialize

php_binary:存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值。
php:存储方式是,键名+竖线+经过serialize()函数序列处理的值。
php_serialize(php>5.5.4):存储方式是,经过serialize()函数序列化处理的值。
因此当session以”php_serialize”方式存储以”php”方式反序列化时,漏洞产生。
构造,$_SESSION[‘name’] = “|序列化内容”即可。
基本的原理懂了就好了,万变不离其宗,顶多在这个基础上增加一些小tips,例如利用php的内置类,配合ssrf等。
3.phar伪协议反序列化
利用phar伪协议触发反序列化是Black Hat的一个议题,看了一些师傅的文章这里总结记录一下。
phar协议会以序列化的形式存储用户自定义的meta-data,php一大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化,因此在文件系统函数的参数可控情况下,配合phar://伪协议,可以不依赖unserialize()函数直接进行反序列化操作。
由于自己暂时还没遇到实际问题,待后续补充。

参考文章

知道创宇paper
PHP反序列化漏洞的新攻击面

生活不止眼前的苟且。

文章目录
  1. 1. 一、魔术方法
  2. 2. 二、可利用的POP链
  3. 3. 三、反序列化漏洞利用的场景
  4. 4. 参考文章
  • 生活不止眼前的苟且。