一、概述
在现有很多的应用当中,需要对某些对象进行序列化,让它们离开内存空间,入驻物理硬盘,以便可以长期保存,其中最常见的是Web服务器中的Session对象。对象的序列化一般有两种用途:把对象的字节序列永久地保存到硬盘上,通常存放在一个指定文件中;或者在网络上传送对象的字节序列。
而把字节序列恢复为对象的过程称为对象的反序列化。当两个进程在进行远程通信时,彼此可以发送各种类型的数据,而且无论是何种类型的数据,都会以二进制序列的形式在网络上传送。
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。
序列化的操作主要围绕以下两个函数:
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:
__construct() //创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
下面是对序列化后数据的详细介绍
二、实施过程
1.打开反序列化漏洞的页面
2.发现是输入一段序列化的代码,这里我们可以自己写一个序列化的脚本,脚本肥肠煎蛋,只是建立了一个类,并实例化对象,然后把对象序列化输出(这里使用了菜鸟工具在线编辑)
<?php
class S{
var $test = "<script>alert('xss')</script>";
}
echo '<br>';
$a = new S();
echo serialize($a);
?>
3.把代码输入到pikachu里面,进行实验
成功弹出xss
三、防范措施
序列化:对象转换为数组或字符串等格式
反序列化:将数组或字符串等格式转换成对象
反序列化漏洞是一种配合型的漏洞,它不能产生漏洞,而是触发了别的漏洞,对于输入的值没有做校验,就有可能触发比如‘xss’、SQL注入、目录遍历等不可控的后果。
然后就是在系统中,会有防入侵检测机制,检测日志当中,可能存在的风险,比如你输入数据的一些操作,监控数据传入传出的过程等等,这样就能找出数据传入后,变量可能存在的一些问题。