php反序列化漏洞

  

0 x00序列化

  

所有php里面的值都可以使用函数序列化()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。所有php里面的值都可以使用函数
序列化()
来返回一个包含字节流的字符串来表示。
unserialize ()
函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
& lt; !——更多的在
序列化的例子

  
 <代码类="语言"> & lt; php ?/* *
  *
  * @authors犹豫(daikersec@gmail.com)
  * @date 2017-12-22 15:39:43
  $ * @version $ Id
  */error_reporting (E_ALL);
  var_int=1美元;
  美元var_str=" 123 ";
  var_float=1.2美元;
  美元var_bool=true;
  $ var_arr=阵列(' 1 '=比;1、1.2、假);
  类名称{
  var var_name=1美元;
  函数myfunction () {
  返回“1”;
  }
  }
  $ arrayName=阵列($ var_int var_str美元var_float美元,美元var_bool, var_arr美元,新类名());
  
  foreach (arrayName美元美元关键=比;美元值){
  回声序列化(价值美元)。“& lt; br/祝辞”;
  }
   
  

结果是   

 <代码类="语言"> i: 1;
  s: 3:“123”;
  d: 1.2;
  b: 1;
  3:{我:1;我:1,:2,d: 1.2;我:3;b: 0;}
  O: 9:“类名”:1:{:8:“var_name”;我:1;} 
  

从例子中我们可以看的到,变量,数组,对象可以被序列化。变量的值会被保存下来。以<代码>:隔开,类名会被保存下来,类变量,类变量名和类变量值会被保存下来,类方法不会被保存起来。

  

0 x01反序列化

  

反序列化就是将序列化后的字符串转化回数组和对象
看例子

  
 <代码类="语言"> & lt; php ?/* *
  *
  * @authors犹豫(daikersec@gmail.com)
  * @date 2017-12-22 16:02:17
  $ * @version $ Id
  */un_arr_str美元=' 3:{我:1;我:1,:2,d: 1.2;我:3;b: 0;}”;//$ var_arr=阵列(' 1 '=比;1、1.2、假);
  美元un_class_str=' O: 9:“名称”:1:{:8:“var_name”;我:1;}';
  var_dump (unserialize (un_arr_str美元));
  (O=unserialize美元un_class_str);//var_dump (O);
  var_dump (O→美元var_name);  
  

这里的结果是

  
 <代码类="语言">数组(3){[1]=比;int(1)[2]=比;浮动(1.2)[3]=比;bool (false)}
  零代码 之前
  

比较奇怪的是为什么第二个会是NULL。因为将对象序列化之后,只是保存它的关键数据,对于这个类的具体内容一无所知,所以反序列回一个对象的时候,需要反序列的上下文中存在模板(这里就是类的定义)。

  

0 x02魔术函数

  

PHP将所有以__(两个下划线)开头的类方法保留为魔术方法。
下面举一个例子。

  
 <代码类="语言">类名称{
  
  函数__construct () {
  回声“你好,我是__construct”;
  }
  }
  
  新类名(); 
  

这里的输出结果是

  
 <代码类="语言">你好,我__construct  
  

其实这里的一个对象实例化的过程中默认会调用的__construct ()。
php常用的魔术函数有

  
 <代码类="语言"> __construct (), __destruct (), __call (), __callStatic (), __get (), __set (), __isset (), __unset (), __sleep (), __wakeup (), __toString (), __invoke (), __set_state (), __clone()和__debugInfo()  
  

这里们并非每个都会在这里面用的到,下面用一个例子来说下看几个常用到的魔术函数。

  
 <代码类="语言"> & lt; php ?/* *
  *
  * @authors犹豫(daikersec@gmail.com)
  * @date 2017-12-22 16:24:32
  $ * @version $ Id
  */类名称{
  私人$ name=" 123 ";
  函数__construct () {
  回声“你好,我是__construct”。“& lt; br/祝辞”;
  }
  函数__destruct () {
  回声“你好,我是__destruct”。“& lt; br/祝辞”;
  }
  函数__wakeup () {
  回声“你好,我是__wakeup”。“& lt; br/祝辞”;
  }
  函数__sleep () {
  回声“你好,我是__sleep”。“& lt; br/祝辞”;
  返回数组($ this→名称);
  }
  函数__get(美元的名字){
  回声“你好,我是__get”。“& lt; br/祝辞”;
  返回$ this→名称;
  }
  函数__toString () {
  回声“你好,我是__toString”。“& lt; br/祝辞”;
  返回“你好”;
  }
  }
  
  O=美元新类名();
  $ s=序列化(O);
  echo $ s。“& lt; br/祝辞”;
  O=美元unserialize ($ s);
  o .美元“& lt; br/祝辞”;
  O→美元;
  

php反序列化漏洞