PHP反序列化漏洞详解

PHP反序列化漏洞

  首先我们要了解反序列化就要明白什么是序列化

序列化

  序列化是一个将对象转化为实例的过程

  在php文件中,有的对象内容需要使用,但是使用的频率不高,将代码存放的话会占用系统资源,但是删除则下次使用时就要重新码增加了负担,所以序列化就帮助程序员解决了这个问题,它可以将不常用的代码进行序列化,从而省去了系统的空间,当需要使用这段代码时将代码反序列化就可以接着使用

  序列化类似于json格式,有序列化函数:serialize()

  示例代码:

  

<?php
class democlass
{
    public $name = "Tony";
    public $sex = "man";
    public $age = "22";
}

$example = new democlass();
$example->name = "John";
$example->sex = "woman";
$example->age = "18";

echo serialize($example);

?>

  访问代码后:  

  O:代表对象

  a :表示数组

  s:表示字符

  

反序列化

  了解了序列化后就明白反序列化就是将一个实例转为对象的过程

  反序列化函数:unserialize()

 

漏洞如何利用

  从上我们可以看出,序列化和反序列化都是非常正常的常用手法,为什么在常见的过程中会出现漏洞呢?这个时候我们就要了解一下php的魔法函数:

  _construct() 当一个对象被创建时调用

  _destruct() 当一个对象被销毁时调用
  _toString() 当一个对象被当作一个字符串使用
  _sleep() 在对象再别序列化之前运行
  _wakeup() 将在序列化之后调用

 

   当实例转为对象时会触发魔法函数,直接调用执行,所以当我们将一个恶意代码进行序列化后,再进行反序列化就会直接触发执行恶意代码

  示例代码:

  

<?php
class S{
    public $test = "<img src=x onerror=alert(1)>";
}
$a = new S();
echo serialize($a);
?>

  执行生成实例代码:O:1:"S":1:{s:4:"test";s:28:"<img src=x onerror=alert(1)>";}

  然后将实例进行反序列化

  

 

 直接执行xss语句,形成反序列化漏洞

posted @ 2020-02-09 16:58  终落  阅读(854)  评论(0)    收藏  举报
页脚Html代码