php反序列化原理及注入基础。
序列化是对象串行化,对象是一种在内存中存储的数据类型,寿命是随生成该对象的程序的终止而终止,为了持久使用对象的状态,将其通过serialize()函数进行序列化为一行字符串保存为文件,使用时再用unserialize()反序列化为对象。
序列化举例
数组:
a:<length>:{key, value pairs};
a:1:{i:1;s:1:"a";}
对象:
O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>};
O:6:"person":3:{s:4:"name";N;s:3:"age";i:19;s:3:"sex";N;}
这部分内容适宜搭建合适的php运行和调试环境学习:
环境推荐:小皮面板+sublimetext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <!--
<?php class test { private $flag = 'Inactive'; protected $test = "test"; public $test1 = "test1";
public function set_flag($flag) { $this->flag = $flag;
} public function get_flag() { return $this->flag; } } $object = new test(); $object->set_flag('Active'); $data = serialize($object); echo $data; echo '<hr>'; #O:4:"test":3:{s:10:"testflag";s:6:"Active";s:7:"*test";s:4:"test";s:5:"test1";s:5:"test1";} echo 'aaa'; ?>
<!--只要在魔术方法中存在能利用的函数 对这个对象的属性做特殊的操控 进而影响这些函数的调用逻辑 1>__construct() 2>__sleep() 3>__wakeup() 4>__destruct() 5>__toString()把对象当作字符串使用时 6>__invoke()把对象当函数使用时 7>__call()调用对象不存在的方法的时候 -->
|