谈一谈php反序列化(Php反序列化)

发布时间:2022-11-16

本文目录一览:

  1. 请写出php变量序列化和反序列化的函数,并举出1个应用例子
  2. 这个网站干什么的 什么是PHP反序列化靶机实战
  3. thinkphp 反序列化有什么用
  4. php如何循环反序列化?
  5. php中序列化与反序列化

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

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

$str = serialize($obj);
...
$obj222 = unserialize($str);

现在可以用$obj222对象来执行该对象可以执行的各种操作。在用serialize序列化对象时,会自动调用__sleep方法,__sleep方法必须返回一个数组,包含需要串行化的属性。PHP会抛弃其它属性的值,如果没有__sleep方法,PHP将保存所有属性,包括private属性。用unserialize反序列化对象时,PHP会调用__wakeup方法。__sleep__wakeup方法可以根据实际需要,都添加上,也可以只要其中的一个,当然也可以都不要。 下面给出一个序列化的代码:共serialize.phpunserialize.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.php<br/>";
echo $u2->p() . "<br/>";
echo $u2->sex . "<br/>";
print_r($u2);
?>

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

在我们讲PHP反序列化的时候,基本都是围绕着serialize()unserialize()这两个函数。那么什么是序列化呢,序列化说通俗点就是把一个对象变成可以传输的字符串。举个例子,不知道大家知不知道JSON格式,这就是一种序列化,有可能就是通过数组序列化而来的。而反序列化就是把那串可以传输的字符串再变回对象。而反序列化则比较容易出现漏洞。 这么序列化一下然后反序列化,为什么就能产生漏洞了呢? 这个时候,我们就要了解一下PHP里面的魔术方法了,魔法函数一般是以__开头,通常会因为某些条件而触发,不用我们手动调用。 在研究反序列化漏洞的时候,如果服务器能够接收我们反序列化过的字符串、并且未经过滤地把其中的变量直接放进这些魔术方法里面的话,就容易造成很严重的漏洞。 所以这个网站其实希望告诉大家这个反序列化的问题,并提供一些实战练习。

thinkphp 反序列化有什么用

ThinkPHP系统变量、常量、序列化、反序列化、缓存

变量的输出:

在模板中输出一个变量有两种形式:

  • {$list.name}
  • {$list['name']} 在模板中可以使用系统变量,以$Think.开头。

系统变量(举例选几个):

  • 获得服务器的IP地址:{$Think.server.SERVER_ADDR}
  • 获得外部访问的IP地址:{$Think.server.REMOTE_ADDR}
  • 获得服务器的名称:{$Think.server.SERVER_NAME}

获得ThinkPHP内部定义的变量:

  • 获得当前的时间:{$Think.now}
  • 获得当前工具的版本:{$Think.version}
  • 模板的页面:{$Think.template}
  • 模板标签起始符号:{$Think.LDELIM}
  • 模板标签结束符号:{$Think.RDELIM}

系统常量(举例选几个):

  • 获得当前文件的URL:{$Think.const.__SELF__}
  • 获得模板配置文件的配置项的值:{$Think.config.db_name} 在ThinkPHP模板中,对变量使用函数调节: 从控制器分配了一个字符串,在模板中,如何截取这个字符串:{$str|substr=###,5,3},如果当前参数为函数的第一个参数,可以不写###。 在模板中加载外部文件: 使用include file=""file()display()的用法一样。

If标签的使用:

{if condition="条件1"}value1{elseif condition="条件2"}value2{else}value3{/if}

condition里面写成比较运算符:

  • eq表示等于
  • neq表示不等于

修改模板引擎的界定符:

在配置文件中,通过TMPL_L_DELIM修改:

'TMPL_L_DELIM' => '{', // 修改左定界符
'TMPL_R_DELIM' => '}', // 修改右定界符

修改模板引擎:

'TMPL_ENGINE_TYPE' => 'Smarty'

在分组中添加配置文件,在控制器中使用直接调用C函数。

ThinkPHP的缓存机制:

数据缓存:

就是将数据库中获得的数据保存在一个介质上,需要时直接在这个介质上读取。 我们需要通过ThinkPHP中的cache类来实现,通过这个类的方法获得对象,在通过这个对象来实现不同介质的数据处理。 通过传递不同的参数获得不同的数据处理对象:

$cache = Cache::getInstance('File');

页面缓存:

  1. 开启缓存 在配置文件中开启缓存,开启缓存有一定的规则(数组格式):
'HTML_CACHE_ON' => true,
'HTML_CACHE_RULES' => array(
    // 需要缓存的动作名=缓存的名称,缓存的生存周期
    'show' => array('{:module}_{:action}', 1000),
)
  • {:module}代表当前的控制器名
  • {:action}代表当前的动作名(例如:show)
  • {$_GET}={$Think.get.id} 简写形式{$_get} 通过地址栏传递一个id参数,可以实现单页面多缓存(通常是前台有缓存,后台不缓存)。

局部不缓存:

在TP框架中,局部不缓存可以通过jsajaxjQuery实现局部不缓存:

<script type="text/javascript">
var date = Date();
document.write(date);
</script>

工厂模式:

通过传递不同参数获得不同的对象。

单例模式:

这个类只获得一个对象,再调用这个对象方法。

缓存的增删改查:

  • 增:$cache->set('password', '123', 30) 第三个参数是缓存的有效期
  • 删:rm()
  • 改:set()
  • 查:get()

序列化(serialize()):

保存数据的时候,将数组或者对象序列化成字符串,但是这个字符串保存了数组或者对象之前的结构和内容,当我们需要获得这个数据的时候,再将序列化的字符串反序列化成我们需要的数组或对象(unserialize())。

示例:

public function xv()
{
    // 序列化与反序列化
    $a = array('name' => 'xiaoming');
    $x = serialize($a);
    echo $x; // 输出结果为:a:1:{s:4:"name";s:8:"xiaoming";}
    echo "<br/>";
    $f = unserialize($x);
    print_r($f); // 输出原来的数组格式
}

php如何循环反序列化?

  1. 构造HITCON类反序列化字符串,其中$method='login'$args数组'username'部分可用于构造SQL语句,进行SQL注入,'password'部分任意设置。
  2. 调用login()函数后,利用username构造联合查询,使查询结果为SoFun类反序列化字符串,设置username构造联合查询,使查询结果为SoFun类反序列化字符串,设置username构造联合查询,使查询结果为SoFun类反序列化字符串,设置file='flag.php',需绕过__wakeup()函数。
  3. 绕过loadData()函数对反序列化字符串的验证。
  4. SoFun类__destruct()函数调用后,包含flag.php文件,获取flag,需绕过__wakeup()函数。

php中序列化与反序列化

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

  • serialize():把变量和它们的值编码成文本形式
  • unserialize():恢复原先变量

示例:

$a = array("Moe", "Larry", "Curly");
$s = serialize($a);
echo $s;

结果:

a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
print_r(unserialize($s));

结果:

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

当把这些序列化的数据放在URL中在页面之间传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理。 magic_quotes_gpcmagic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。

  • 如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理。
  • 如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理。 当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeup()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。