代码编织梦想

0x001 漏洞产生原理

在反序列化的过程中自动触发了某些魔术方法。未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致XSS、代码执行、文件写入、文件读取等不可控后果。

0x002 漏洞触发条件

一般只能通过代码审计的方式挖掘该漏洞,寻找代码中unserialize()函数的变量可控,且PHP文件代码中存在可利用的类,同时类中具有魔术方法。

0x003 PHP魔术方法__construct() 当一个对象创建时被调用

__destruct() 当一个对象销毁时被调用

__toString() 当一个对象被当作一个字符串使用

__sleep() 在对象在被序列化之前运行

__wakeup 将在序列化之后立即被调用

0x004 序列化数据格式

序列化主要分为字符型、数组型、对象型。

orange.progress-bar-stripe-loader.svg

以序列化对象格式为例

orange.progress-bar-stripe-loader.svg

0x005 反序列化漏洞

1. XSS

漏洞示例demo2.php:

构造序列化值:

利用序列化值构造POC:

成功在页面进行了弹窗:在序列化数据之后,立即自动调用了__wakeup()函数,执行 1

orange.progress-bar-stripe-loader.svg

2. 代码执行

漏洞示例test.php:

构造序列化值:

利用序列化值构造POC:

成功显示了phpinfo页面:在反序列化该数据时,自动触发了_destruct()函数,执行 eval(phpinfo())。

orange.progress-bar-stripe-loader.svg

3. 文件写入

漏洞示例demo3.php:

构造序列化值:

利用序列化值构造POC:

成功将phpinfo写入了shell.php:在反序列化该数据结束后,,立即自动调用了__wakeup()函数,而在__wekeup()创建了对象后,就会自动调用__construct()函数,从而执行了文件写入的操作。

orange.progress-bar-stripe-loader.svg

4. 文件读取

以2020 ISCC CTF中的一道题为例

代码审计

以GET形式传入一个data参数,并且对data参数进行了反序列化;

使用了_toString() 当一个对象被当作一个字符串时自动调用

使用file_get_contents()包含$file文件内容;

最后使用base64_encode()加密输出$file文件中的内容。

构造序列化值:

利用序列化值构造POC:

成功显示了flag.php文件中的内容:在反序列化该数据时,自动触发了_toString()函数,执行 base64_encode(file_get_contents($filename))。

orange.progress-bar-stripe-loader.svg

5. 漏洞拓展

上面讲的都是基于魔术方法下的敏感操作导致的反序列化导致的安全问题。但是当漏洞/危险代码存在在类的普通成员方法中,该如何利用呢?

漏洞示例demo4.php:

我们发现类的普通方法调用eval()函数,这个函数很危险,如果可控就可能造成代码执行。

通过代码发现$_GET['test']可控,因为使用unserialize()会自动调用__destruct(),所以它会先调用action()函数,然后会走到x1类和x2类,而安全问题在x2类中。

构造如下序列化代码serialize-demo4.php:

上述序列化代码运行后得到的序列化值:

利用得到的序列化值构造POC:

orange.progress-bar-stripe-loader.svg

0x006 反序列化webShell

1. 配合菜刀getShell

漏洞示例test.php:

利用eval()传入可控参数,写入一句话木马 <?php @eval($_GET[cmd]);?>,构造序列化数据值:

利用序列化值构造POC:

执行该POC后,会在同级目录下生成一个shell.php文件,通过菜刀连接访问shell.php,即可getShell。

orange.progress-bar-stripe-loader.svg

2. 反序列化木马

利用反序列化的特点,编写webShell木马

使用菜刀连接该webShell木马

orange.progress-bar-stripe-loader.svg

此木马与正常文件很像,所以对于免杀安全狗等防护软件效果很不错。

参考文章

php代码中的序列化与反序列化(1)_vis-wing的博客-爱代码爱编程

序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符串,构造成相应的对象,反序列化是序列化的逆过程。 0×00 序列化和反序列化 简单的理解:序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符

php反序列化漏洞与webshell_vspiders的博客-爱代码爱编程

前言 最近和小伙伴们一起研究了下PHP反序列化漏洞,突发奇想,利用反序列化漏洞写一个一句话木马效果应该蛮不错的。于是便有此文。 0x01 PHP反序列化 说起PHP反序列化,那必须先简单说一下PHP的序列化。PHP序列化是将一个对象、数组、字符串等转化为字节流便于传输,比如跨脚本等。而PHP反序列化是将序列化之后的字节流还原成对象、字符、数组等。但是P

php+反序列化代码执行漏洞,session反序列化代码执行漏洞分析[Joomla RCE]-爱代码爱编程

Author:L.N.@360adlab 0x01 漏洞影响版本 PHP < 5.6.13 0x02 joomla利用程序分析 joomla具体漏洞分析请看phith0n牛分析文章,本文只讨论此漏洞的核心问题所在。 利用程序poc: }__test|O:21:"JDatabaseDriverMysqli":3:{s:2:"fc";

php+反序列化代码执行漏洞,php反序列化漏洞总结-爱代码爱编程

0X00 背景 上周打ctf遇到了一道php反序列化的题,不是很难,但是还是想就着这道题把php反序列化漏洞做下总结。 0X01 php序列化 说php反序列化首先还是要说下什么是php序列化。 PHP serialize — 产生一个可存储的值的表示 1 serialize—产生一个可存储的值的表示 这是php官网对它的解释,也就是说

php反序列化漏洞原理,PHP反序列化原理及漏洞解析-爱代码爱编程

什么是PHP序列化 PHP序列化与反序列化的过程 一个反序列化漏洞的例子 CVE-2016-7124 一. 什么是PHP序列化与反序列化 1. PHP序列化 PHP序列化是指把变量转化成可保存或传输的字符串的过程,PHP序列化函数有serialize、json_encode。 以下例子可以实现PHP序列化 1 2 3 4 5

php反序列化漏洞条件,PHP反序列化漏洞总结-爱代码爱编程

写在前边 做了不少PHP反序列化的题了,是时候把坑给填上了。参考了一些大佬们的博客,自己再做一下总结 1.面向对象 2.PHP序列化和反序列化 3.PHP反序列化漏洞实例 1.面向对象 在了解序列化和反序列化之前,先简单了解一下PHP的面向对象。 万物皆可对象。根据官方手册,PHP中,以关键字class定义一个类,一个类可以包含有属于自己

php的反序列化漏洞扫描,浅析php反序列化漏洞-爱代码爱编程

反序列化在很多语言中都比较常见,下面简单介绍php的反序列化漏洞(对象注入)。 0x00.是什么 ——what php反序列化漏洞,又叫对象注入。 涉及到的是php中的两个函数:unsearialize()与serialize()。后者为将一个对象或者数组转换为字符串以便保存,前者则将尝试将字符串恢复为对象或者数组。 关于这个漏洞大家平时可能