php反序列化(php序列化和反序列化函数)

http://www.itjxue.com  2023-01-30 08:57  来源:未知  点击次数: 

php中序列化与反序列化

把复杂的数据类型压缩到一个字符串中

serialize() 把变量和它们的值编码成文本形式

unserialize() 恢复原先变量

eg:

结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}

Array ( [0] = Moe [1] = Larry [2] = Curly )

当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:

margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。

如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:

如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:

当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。

这个网站干什么的 什么是PHP反序列化靶机实战

在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。那么什么是序列化呢,序列化说通俗点就是把一个对象变成可以传输的字符串。举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的。而反序列化就是把那串可以传输的字符串再变回对象。而反序列化则比较容易出现漏洞。

这么序列化一下然后反序列化,为什么就能产生漏洞了呢?

这个时候,我们就要了解一下PHP里面的魔术方法了,魔法函数一般是以__开头,通常会因为某些条件而触发不用我们手动调用:

在研究反序列化漏洞的时候,如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里面的话,就容易造成很严重的漏洞了。

所以这个网站其实希望告诉大家这个反序列化的问题,并提供一些实战练习。

请写出php变量序列化和反序列化的函数,并举出1个应用例子

PHP中的序列化和反序列化分别通过函数serialize()和unserialize()即可实现。serialize()的参数可以是resource类型外的所有变量类型,最常见的是用来序列化对象,unseialize()将serialize的返回结果作为参数,进行反序列化,得到原对象。$str = serialize ($obj);...$obj222 = unserialize($str);现在可以用$object222对象来执行该对象可以执行的各种操作。在用serialize序列化对象时,会自动调用__sleep方法,__sleep方法必须返回一个数组,包含需要串行化的属性。 PHP会抛弃其它属性的值, 如果没有__sleep方法,PHP将保存所有属性,包括private属性。用unserialize反序列化对象时,PHP 会调用__wakeup方法。__sleep和__wakeup方法可以根据实际需要,都添加上,也可以只要其中的一个,当然也可以都不要。下面给出一个序列化的代码:共serialize.php和unserialize.php两个文件。// serialize.php?php

class User

{

private $name;

private $id;

public $sex="F";

function __construct()

{

//give user a unique ID 赋予一个不同的ID

$this-id = uniqid();

}

function __sleep()

{

//do not serialize this-id 不串行化id

return(array("name","sex"));

}

function __wakeup()

{

//give user a unique ID

$this-id = uniqid();

}

function p(){

echo "in function p() \t";

return $this-name;

}

function setname($name){

$this-name = $name;

}

} //create object 建立一个对象

$u = new User;

$u-setname("pphu");

//serialize it 串行化

$s = serialize($u);

echo "in serialize.php br/";

print_r($s);

echo "br/";

print_r($u);

echo "br/br/";

? //// unserialize.php?php

include('serialize.php');

//global $s;

$u2 = unserialize($s);

echo "in unserialize.phpbr/";

echo $u2-p()."br/";

echo $u2-sex."br/";

print_r($u2);

?

php如何循环反序列化?

1.构造HITCON类反序列化字符串,其中$method='login',$args数组’username’部分可用于构造SQL语句,进行SQL注入,'password’部分任意设置。

2.调用login()函数后,利用username构造联合查询,使查询结果为SoFun类反序列化字符串,设置username构造联合查询,使查询结果为SoFun类反序列化字符串,设置username构造联合查询,使查询结果为SoFun类反序列化字符串,设置file=‘flag.php’,需绕过__wakeup()函数。

3.绕过oadData()函数对反序列化字符串的验证。

4.SoFun类?__destruct()函数调用后,包含flag.php文件,获取flag,需绕过__wakeup()函数。

[世安杯]一道关于php反序列化漏洞的题目

题目地址:

点进去,看到

没什么信息,因此ctrl+u查看源码:

看到提示,file_get_contents()函数,联想到文件包含漏洞,因此google一波,查到

由于本题:allow_url_include=On

因此可以包含一个远程文件,假设你的云服务IP地址为:xxx

则可以输入

其中a.txt的内容为: the user is admin

用base64解码,得到

看到源码之后,明白了需要使用$file把class.php包含进来,然后把$pass反序列化之后, echo $pass 这句话会执行对象里面的__toString函数,具体的反序列化漏洞查看

因此,接下来只要找到序列化之后的字符串,然后GET给pass就行了

复制class.php的源码到自己的虚拟机上,修改一下

保存之后,通过浏览器访问,得到:

接着把这个序列化字符串赋值给pass,以及用file包含class.php,构造出:

执行之后得到:

发现什么都没有,CTRL+U查看源码

这样就得到了flag;

此外,可以参考我之前的一篇文章 php伪协议的使用[获得webshell]

使用file= php://input ,之后传入一个webshell,再读取f1a9.php

php的序列化和反序列化有什么好处

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。

PHP中的序列化和反序列化分别通过函数serialize()和unserialize()即可实现。serialize()的参数可以是resource类型外的所有变量类型,最常见的是用来序列化对象,unseialize()将serialize的返回结果作为参数,进行反序列化,得到原对象。

在PHP中,序列化和反序列化很多地方都可以用到!~

例如:数据库连接,序列化数组等等。

(责任编辑:IT教学网)

更多

推荐淘宝营销文章