首页 > 编程语言 >PHP反序列化

PHP反序列化

时间:2023-02-26 22:48:15浏览次数:32  
标签:__ 触发 PHP 函数 对象 调用 序列化

用户数据在$_SESSION中存储,当用户数据过大,内存占用过大,为了节省内存,选择把用户数据存储在文件中,即使用serialize()函数把用户数据存储到文件中,在使用的时候,在通过unserialize()函数调用

漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果

serialize()

函数用于序列化对象或数组,并返回一个字符串。

整数12i:12;

字符串abcs:3:"abc";

浮点型3.14d:3.14;

布尔型:true->b:1;、false->b:0;

数组array('abc','ab')a:2:{i:0;s:3:"abc";i:1;s:2:"ab";}

NULL:N;

<?php
class obje{
    var $name = 'clancy';
    var $age = '18';
    function play(){
        echo $this->age;
        echo "\n";
    }
}
$p = new obje();
$p->play();
var_dump($p);
echo serialize($p);
?>

18
object(obje)#1 (2) {
  ["name"]=>
  string(6) "clancy"
  ["age"]=>
  string(2) "18"
}
O:4:"obje":2:{s:4:"name";s:6:"clancy";s:3:"age";s:2:"18";}

unserialize()

函数用于将通过serialize()函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

<?php
class obje{
    var $name = 'clancy';
    var $age = '18';
}
$p = new obje();
$c = serialize($p);
var_dump(unserialize($c));
?>

object(obje)#2 (2) {
  ["name"]=>
  string(6) "clancy"
  ["age"]=>
  string(2) "18"
}

对象中的成员变量可控,成员函数如__wakeup()中调用了危险函数,然后在反序列化就会有漏洞

反序列化黑盒测试基本测不出来,需要代码审计

PHP魔术方法
_construct(): 创建对象时初始化
_destruction(): 结束时销毁对象
_toString(): 对象被当作字符串时使用
_sleep(): 序列化对象之前调用
_wakeup(): 反序列化之前调用
_call(): 调用对象不存在时使用
__wakeup() //使用unserialize时触发
__destruct() //对象被销毁时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发

标签:__,触发,PHP,函数,对象,调用,序列化
From: https://www.cnblogs.com/cowpokee/p/17158025.html

相关文章

  • php怎么连接sqlsrv
    连接MicrosoftSQLServer数据库时,可以使用PHP中的sqlsrv扩展程序来连接数据库。以下是连接MicrosoftSQLServer数据库的一些示例代码:首先,确保已经安装并启用sq......
  • PHP_XXE
    当输入错误用户名和密码的时候,服务端就会返回用户名并提示登录错误adminloginfail!读取文件同理可以读取网站源码,字符需要base64解码......
  • 02_10_Java语音进阶||day10_缓冲流、转换流、序列化流、打印流
    第一章缓冲流1.1概述为了提高效率1.2BufferedOutputStream_字节缓冲输出流java.io.BufferedOutputStreamextendsOutputStreamBufferedOutputStream:字节缓冲输出流继承......
  • [代码审计基础 16]phpyun 防注入绕过
    PHP:5.4.5设置调试:https://blog.csdn.net/m0_46641521/article/details/120107786phpyunSQL注入绕过0x01路由分析01看index先做路由分析,上来直接看index.php文件;......
  • 搭PHP本地环境-windows
    项目中要用php开发,但是本地没环境调试不方便,所以搭一下本期环境。1.下载phpphpstudy工具官网:https://www.xp.cn/。phpstudy和WAMP工具的不同之处在于,phpstudy支持nginx服......
  • Java原生序列化与反序列化
    序列化与反序列化Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。为什么需要序列化?序列化分为两大部分:序列化和反......
  • 配置PHP7环境
    1.准备好安装包wampserver和PhpStorm2.先点击wampserver3.1.9_x64.exe    点击install 进度条满了   选择你想用的浏览器和文本  完成后......
  • PHP 并发方案建议
    1,消息队列解决方案:RabbitMQ:RabbitMQ是一个开源的AMQP消息中间件,提供了高可用、高并发、高吞吐量的消息队列服务。使用PHP语言可以通过AMQP扩展连接到RabbitMQ服......
  • SnakeYaml的不出网反序列化利用分析
    SnakeYaml的常见出网利用方式:!!javax.script.ScriptEngineManager[!!java.net.URLClassLoader[[!!java.net.URL["http://127.0.0.1:9000/yaml-payload.jar"]......
  • EventSource的php与前端事件推送
    EventSourceEventSource是服务器推送的一个网络事件接口。一个EventSource实例会对HTTP服务开启一个持久化的连接,以text/event-stream格式发送事件,会一直保持开启直......