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";}
具体含义:
3.PHP序列化三种权限
序列化为了把这个类的信息完全压缩,自然把属性的权限考虑了进去。
将序列化的内容输入到txt文件里,hexdump打开内容如下:
可以看到三个权限表示的方式是不一个样的。
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++中的析构函数,当对象销毁时调用
下面我们来看一个可利用代码文件
5.2所以该代码的利用思路就是:
1.利用反序列化漏洞篡改__destruct()函数中的this->test=new Evil;使他成为Evil的一个对象
2.篡改$test2=恶意代码,让eval()函数执行
通过脚本构造payload:
脚本在浏览器上输出:
O:4:"test":1:{s:10:"testtest";O:4:"Evil":1:{s:5:"test2";s:10:"phpinfo();";}}
需要注意的是:提交payload时需要将"testtest"私有属性改为”%00test%00test"
具体原因请见序列化的三种权限
将得到的序列化代码提交,成功利用漏洞
6.phar伪协议扩展反序列化攻击面
反序列化攻击必须满足两个点。
1. 必须要有unserialize()函数
2. unserialize()函数的参数必须可控。
phar://攻击使我们不依靠unserialize()函数也可以发动攻击。
原理: phar 文件包在 生成时会以序列化的形式存储用户自定义的 meta-data ,配合 phar:// 我们就能在文件系统函数 file_exists() is_dir() 等参数可控的情况下实现自动的反序列化操作,于是我们就能通过构造精心设计的 phar 包在没有 unserailize() 的情况下实现反序列化攻击,从而将 PHP 反序列化漏洞的触发条件大大拓宽了,降低了我们 PHP 反序列化的攻击起点。
构造:phar包
phar包的内容:
其中含有序列化代码。
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安全——序列化,反序列化漏洞的主要内容,如果未能解决你的问题,请参考以下文章