PHP反序列化漏洞简介及相关技巧小结

 www.lehu88.com     |      2019-08-13 23:46
PHP反序列化漏洞简介及相关技巧小结
*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径
 
要学习PHP反序列漏洞,先了解下PHP序列化和反序列化是什么东西。
 
php程序为了保存和转储对象,提供了序列化的方法,php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。
 
php序列化的函数为serialize。反序列化的函数为unserialize。
 
序列化
举个栗子:
 
<?php
class Test{
         public$a = 'ThisA';
         protected$b = 'ThisB';
         private$c = 'ThisC';
         publicfunction test1(){
                  return'this is test1 ';
         }
}
$test = new Test();
var_dump(serialize($test));
?>
输出:
 
 
解释一下:
 
O代表是对象;:4表示改对象名称有4个字符;:”Test”表示改对象的名称;:3表示改对象里有3个成员。
 
接着是括号里面的。我们这个类的三个成员变量由于变量前的修饰不同,在序列化出来后显示的也不同。
 
第一个变量a序列化后为 s:1:”a”;s:5:”ThisA”;
 
由于变量是有变量名和值的。所以序列化需要把这两个都进行转换。序列化后的字符串以分号分割每一个变量的特性。
 
这个要根据分号来分开看,分号左边的是变量名,分号右边的是变量的值。
 
先看左边的。其实都是同理的。s表示是字符串,1表示该字符串中只有一个字符,”a”表示该字符串为a。右边的同理可得。
 
第二个变量和第一个变量有所不同,多了个乱码和 * 号。这是因为第一个变量a是public属性,而第二个变量b是protected属性,php为了区别这些属性所以进行了一些修饰。这个乱码查了下资料,其实是 %00(url编码,hex也就是0×00)。表示的是NULL。所以protected属性的表示方式是在变量名前加个%00*%00
 
第三个变量的属性是private。表示方式是在变量名前加上%00类名%00
 
可以看到虽然Test类中有test1这个方法,但是序列化后的字符串中并没有包含这个方法的信息。所以序列化不保存方法。
 
反序列化
<?php
class Test{
         public$a = 'ThisA';
         protected$b = 'ThisB';
         private$c = 'ThisC';
         publicfunction test1(){
                  return'this is test1 ';
         }
}
$test = new Test();
$sTest = serialize($test);
$usTest = unserialize($sTest);
var_dump($usTest);
标签:www.lehu88.c

上一篇:中俄东线天然气管道工程干线累计焊接完成495.19公里
下一篇:Java反射和注解