web安全——序列化,反序列化漏洞

Posted 浙传信息安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web安全——序列化,反序列化漏洞相关的知识,希望对你有一定的参考价值。

 

web安全——序列化,反序列化漏洞


1.序列化简介

将原本的数据通过某种手段进行“压缩”,并且按照一定的格式存储的过程就可以称之为序列化。

如:

通常情况下为了前后端之间的传输方便我们将其 json_encode 了,然后我们后端如果接受到这个 json 数据,还能在 json_decode 回来,再通俗一点就是tx 目前不支持直接传输文件夹,我们必须要压缩一下然后传输,对方接收到需要解压才能看到你的数据。


1.1序列化与反序列化的区别

序列化就是将对象用字符串表示,反序列化就是将序列化字符串转换为对象。

注意:

序列化的对象可以是class也可以是Array,string等其他对象。


2.PHP序列化

php 的所谓的序列化也是一个将各种类型的数据,压缩并按照一定格式存储的过程,他所使用的函数是serialize() ,我们来看下面的实例

输出:

O:4:"test":3:{s:10:"testflag";s:8:"siofaonf";s:7:"*test";s:4:"test";s:5:"test1";s:5:"test1";}

具体含义:

web安全——序列化,反序列化漏洞


3.PHP序列化三种权限

序列化为了把这个类的信息完全压缩,自然把属性的权限考虑了进去。

将序列化的内容输入到txt文件里,hexdump打开内容如下:

web安全——序列化,反序列化漏洞

可以看到三个权限表示的方式是不一个样的。

flag作为私有属性,在其前面加了.类名.。

test作为保护属性,在其前面加了.*.。

而test1公有属性则,按照常规理解的方式。

所以总结如下:

在序列化的过程中:

私有属性:.类名.属性名

如:s:10:" test flag";

保护属性:.*.属性名

如:s:7:" * test";

公有属性:属性名

如:test1


4.序列化利用条件

根据上面的序列化输出:

在序列化数据中我们,无法还原类中具有的方法。

所以这就引出了序列化的两个条件。

1.当前所利用的作用域下面必须要有该类存在,该类中必须要含有unserialize()函数。

2.我们只能控制类中的属性来攻击。

因为没有序列化方法,我们能控制的只有类的属性,因此类属性就是我们唯一的攻击入口。


5.序列化-魔法函数

如果只单看序列化,它本身并不存在任何漏洞,但是搭配上PHP的魔法函数,整个程序的执行流程就将变得可控。

一些函数介绍:

1.__construct():创建对象时调用(相当于c++的构造函数)

2.__destruct():销毁对象的时候调用。(相当于c++的析构函数)

3.__sleep():serialize()执行序列化时调用。

4.__weakup():unserialize()函数执行反序列化时调用。

5.__toString():操作字符串时调用。

6.__get() :当从不可访问的属性读取数据

7.__call(): 在对象上下文中调用不可访问的方法时触发


5.1.下面以__destruct()作为例子讲解一下利用流程,其原理都是自动触发魔法函数,篡改属性内容达到攻击目的。

__destruct()函数类似于C++中的析构函数,当对象销毁时调用

下面我们来看一个可利用代码文件

web安全——序列化,反序列化漏洞

5.2所以该代码的利用思路就是:

1.利用反序列化漏洞篡改__destruct()函数中的this->test=new Evil;使他成为Evil的一个对象

2.篡改$test2=恶意代码,让eval()函数执行

通过脚本构造payload:

web安全——序列化,反序列化漏洞

脚本在浏览器上输出:

O:4:"test":1:{s:10:"testtest";O:4:"Evil":1:{s:5:"test2";s:10:"phpinfo();";}}

需要注意的是:提交payload时需要将"testtest"私有属性改为”%00test%00test"

具体原因请见序列化的三种权限

将得到的序列化代码提交,成功利用漏洞

web安全——序列化,反序列化漏洞


6.phar伪协议扩展反序列化攻击面

反序列化攻击必须满足两个点。

  1. 必须要有unserialize()函数

  2. unserialize()函数的参数必须可控。

phar://攻击使我们不依靠unserialize()函数也可以发动攻击。

原理: phar 文件包在 生成时会以序列化的形式存储用户自定义的 meta-data ,配合 phar:// 我们就能在文件系统函数 file_exists() is_dir() 等参数可控的情况下实现自动的反序列化操作,于是我们就能通过构造精心设计的 phar 包在没有 unserailize() 的情况下实现反序列化攻击,从而将 PHP 反序列化漏洞的触发条件大大拓宽了,降低了我们 PHP 反序列化的攻击起点。

构造:phar包

web安全——序列化,反序列化漏洞

phar包的内容:

web安全——序列化,反序列化漏洞

其中含有序列化代码。

phar包的利用:

当访问该php文件时。执行反序列化:


参考文章:

https://www.freebuf.com/column/151447.html

https://www.k0rz3n.com/2018/11/19/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/

以上是关于web安全——序列化,反序列化漏洞的主要内容,如果未能解决你的问题,请参考以下文章

6-Web安全——java反序列化漏洞利用链

Web安全之PHP反序列化漏洞

7-Web安全——java反序列化漏洞CC链1学习

web安全——序列化,反序列化漏洞

web安全PHP反序列化

Web漏洞扫描工具(批量破壳反序列化CMS)?