简介

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。简单来说就是将一大段对象压缩成字符串还不能说明其好处吗
例如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。反之,反序列化根据流重新构造对象

序列化=>将对象转换成字符串 serialize()
反序列化=>将字符串还原成对象 unserialize()
只能改属性不能改方法

常用魔术常量

当一个对象被实例化的时候,会自动调用这个方法,不需要人为触发的方法被称为魔术方法。

__sleep:返回一个包含对象中所有应被序列化的变量名称的数组I serialize函数在序列化类时首先会检查类中是否存在sleep方法。如方法存在,会先调用此方法然后再执行序列化操作。并且只对sleep:返回的数组中的属性进行序列化。如果sleep:不返回任何内容,则null会被序列化,并产生E_NOTICE级别的错误。sleep.不能返回父类的私有成员,否则会产生ERROR_NOTICE级别的错误。对于一些很大但不需要保
存全部数据的对象此方法很有用。 return一个数组

__wakeup:与sleep相反,是在unserialize函数反序列化之前会检查类中是否存在wakeup方法,如果存在会先调用次方法然后再执行反序列化操作。用于在反序列化之前准备一些对象需要的资源,或其他初始化操作。

__tostring:返回一个类被当做字符串时要输出的内容,此方法必须返回字符串并且不能在此方法中抛出异常,否则会产生致命错误。。

__invoke:PHP5.3起,当尝试以函数的方式调用对象时,会调用此方法。

__call:在对象中调用一个不可访问方法时调用。

__construct:构造函数。

__destruct:析构函数。

序列化

属性  url编码后可见
public 不变 类型:字符长度:字符
private %00 xxx %00 xxx
protected %00*%00 xxx
不同属性序列化时会有所不同 private和protect都会有不可见字符

phar反序列化漏洞

phar协议 =>文件包含

前提:

Phar需要PHP>=5.2 生成的phar的时候,需要在php.ini中将phar.readonly设为Off(注意去掉前面的分号)

原理

在软件中,PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发phar文件本质上是一种压缩文件,会以序列化的形式存储用户自定义的meta-data。当受影响的文件操作函数调用phar文件时,会自动反序列化meta-data内的内容。

文件相关函数(file_get_contents、unlink等)

参数可控 phar://

前提

利用条件
phar文件要能够上传到服务器端。
要有可用的魔术方法作为“跳板”。
文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。

绕过

当环境限制了phar不能出现在前面的字符里
compress.bzip://phar:///test.phar/test.txt
compress.bzip2://phar:///test.phar/test.txt
compress.zlib://phar:///home/sx/test.phar/test.txt
php://filter/resource=phar:///test.phar/test.txt
php://filter/read=convert.base64-encode/resource=phar://phar.phar
文件头验证:
$phar->setStub("GIF89a"."<?php_HALT_COMPILER();?>")
"GIF89a"随意更改

利用

class TestObject {
  }

  @unlink("phar.phar");
  $phar = new Phar("phar.phar"); //后缀名必须为phar
  $phar->startBuffering();
  $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
  $o = new TestObject();
  $phar->setMetadata($o); //将自定义的meta-data存入manifest
  $phar->addFromString("test.txt", "test"); //添加要压缩的文件
  //签名自动计算
  $phar->stopBuffering();
?>
url里填写
phar://phar.phar/test.txt

受影响函数

fileatime
file put contents
fileinode
is dir
is readable
copy
filectime
file
filemtime
is executable
is writable
unlink
file exists
filegroup
fileowner
is file
is writeable
stat
file get content
fopen
fileperms
is link
parse ini file
readfile

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注