写在前边

  做了不少PHP反序列化的题了,是时候把坑给填上了。参考了一些大佬们的博客,自己再做一下总结

1.面向对象
2.PHP序列化和反序列化
3.PHP反序列化漏洞实例

1.面向对象

  在了解序列化和反序列化之前,先简单了解一下PHP的面向对象。

  万物皆可对象。根据官方手册,PHP中,以关键字class定义一个类,一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。

class People
{
//声明属性
public $name;
//声明方法
public function eat()
{
echo $this->name."在吃饭";
}
}

  现在已经定义好了一个类,接下来用关键字new来实例化这个类

$people_1 = new People();  //实例化对象
$people_1->name = '张三';  //属性赋值
$people_1->Eat();      //调用方法

  完整代码

<?php

class People
{
public $name;
public function eat()
{
echo $this->name."在吃饭";
}
} $people_1 = new People();
$people_1->name = '张三';
$people_1->Eat(); ?>

  效果:

2.PHP序列化和反序列化

  根据官方手册,所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。emmmm。。。。个人理解其实就是为了解决PHP在执行当前脚本需要跨脚本文件传递某些变量内容时,但因为之前脚本执行完后把内容释放掉从而无法获取的问题。serialize可以将变量转换为字符串,并且在转换的过程中可以保存当前变量的值,而unserialize则可以将serialize生成的字符串转换回变量。

根据之前的例子,再添加个age属性

<?php

class People
{
public $name;
public $age; //新加属性
public function Eat()
{
echo $this->name."在吃饭</br>";
}
} $people_1 = new People();
$people_1->name = '张三';
$people_1->age = 18;
$people_1->Eat();   //序列化
echo serialize($people_1);
?>

  效果:

  O:6:"People":2:{s:4:"name";s:6:"张三";s:3:"age";i:18;}就是当前people_1这个对象序列化后的形式。"O"表示对象,“6”表示对象所属的类长度为6,“People”为类名,“2”表示有2个参数。“{}”里面是参数的key和value,s:4:"name"表示这个参数的string类型,长度为4,key值是name。后面以此类推,i表示int类型

  然后反序列化这段,新建一个文件test2.php

<?php

class People
{
public $name;
public $age;
public function eat()
{
echo $this->name."在吃饭</br>";
}
} //重建对象
$usr = unserialize('O:6:"People":2:{s:4:"name";s:6:"张三";s:3:"age";i:18;}'); //输出
$usr->eat();
?>

  效果:

  其实吧,个人感觉序列化和反序列化就类似于存取数组。举个不恰当的例子,就像积木,序列化一个把搭建好后的积木收拾好,反序列化就是把收拾好的积木再按照原来的图纸搭起来。接下来说到的反序列化漏洞就类似于把原来的积木换了个颜色,某块积木形状对的但颜色不对,按照图纸搭起来就是感觉违和。

3.PHP反序列化漏洞

  了解了什么是序列化和反序列化后,是时候研究一下PHP反序列化漏洞了,实际上,PHP反序列化漏洞利用的条件在实际环境中比较苛刻,但是如果可以利用一般都会产生很严重的后果

  该漏洞需要有以下条件: 

    1.unserialize函数的参数可控

    2.所写的内容需要有对象中的成员变量的值

    3.脚本中存在一个构造函数(__construct())、析构函数(__destruct())、__wakeup()函数中有向php文件中写数据的操作的类

    __construct()当一个对象创建时被调用

    __destruct()当一个对象销毁时被调用

    __toString()当一个对象被当作一个字符串使用

    __sleep() 在对象在被序列化之前运行

    __wakeup将在序列化之后立即被调用所写的内容需要有对象中的成员变量的值

  这里先借大佬的举个的例子(后续再填坑)

  创建test3.php

<?php
class Test{
var $test = "123";
function __wakeup(){
$fp = fopen("test.php", 'w');
fwrite($fp, $this -> test);
fclose($fp);
}
} $test1 = $_GET['test'];
print_r($test1);
echo "<br />";
$seri = unserialize($test1); require "test.php"; ?>

  先盲目分析一波,Test这类有个重写的__wakeup()这个魔术方法,当序列化后,打开test.php,权限为写,将$test值重写到test.php,用GET方式将值传入$test1,然后反序列化。就是我们如果传入一个序列化后的EXP传入,text.php就会变成我们出传入内容

当值为空时,访问http://本地环境/test3.php?test=  

  根据刚刚的方法,新建一个脚本,序列化一下

<?php
class Test{
var $test = "123";
function __wakeup(){
$fp = fopen("test.php", 'w');
fwrite($fp, $this -> test);
fclose($fp);
}
} $test = new Test();
echo serialize($test); ?>

  然后我们跟上参数 O:4:"Test":1:{s:4:"test";s:3:"123";}

  发现不但页面更改了而且连原文件都被重写了,这时一个PHP反序列化漏洞就产生了

  (目前只是简单总结,实战方面先挖个坑,后续再补)

参考

https://www.freebuf.com/articles/web/167721.html

https://www.jianshu.com/p/be6de8511cb9

如有错误还请指出,谢谢

PHP反序列化漏洞总结的更多相关文章

  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 ...

  10. java反序列化漏洞实战

    准备: 域名一个,用于增加NS解析,判断是否存在反序列化漏洞. 公网IP服务器一台,用于搭建DNS代理,抓包判断. dnschef,DNS代理 ysoserial.jar生成payload. 简单的p ...

随机推荐

  1. TensorFlow系列专题(八):七步带你实现RNN循环神经网络小示例

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! [前言]:在前面的内容里,我们已经学习了循环神经网络的基本结构和运算过程,这一小节 ...

  2. 对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。

    输入描述: 每组数据一行一个数字,为题目中的n(n小于等于1000). 输出描述: 一行输出最后剩下的数字.我的思路是用两个链表,一个用于存储原数据,一个用于存储要丢掉的数据,再循环从元数据中剔除掉即 ...

  3. Java——类的定义

    对象和类的关系:有一个学生 ,需要在表格上填写自己的信息 ,那么这个打印机就像一个类 ,打印出的表格就是一个对象,用类创建对象,学生填的信息 ,就是我所初始化的信息. 类的组成:由 属性(也叫成员变量 ...

  4. React Hooks 实现react-redux

    Redux 是目前 React 系统中最常用的数据管理工具,它落实并发扬了 Flux 的数据单向流动模式,被实践证明为一种成熟可用的模式. 尽管承受着一些非议,Redux 在 React 数据管理界的 ...

  5. 医学图像dcm2d切片文件转3dnii文件

    安装 conda: conda install -c conda-forge dicom2nifti pip: pip install dicom2nifti 更新 conda: conda upda ...

  6. Jupyter修改主题,字体,字号-教程

    cmd控制台安装主题工具包:主题更换工具详解 pip install --upgrade jupyterthemes 查看可用主题: jt -l 设定主题: jt -t 主题名称 恢复默认主题: jt ...

  7. nginx 报 502 bad gateway 分析解决

    出现nginx 502 bad gateway 问题,先从nginx端日志入手,分析排查原因. 1.排查问题 首先需要打开nginx错误日志. 编辑nginx.conf,默认路径在/usr/local ...

  8. [vijos1725&bzoj2875]随机数生成器<矩阵乘法&快速幂&快速乘>

    题目链接:https://vijos.org/p/1725 http://www.lydsy.com/JudgeOnline/problem.php?id=2875 这题是前几年的noi的题,时间比较 ...

  9. 大流量大负载的Kafka集群优化实战

    前言背景 算法优化改版有大需求要上线,在线特征dump数据逐步放量,最终达到现有Kafka集群5倍的流量,预计峰值达到万兆网卡80%左右(集群有几十个节点,网卡峰值流出流量800MB左右/sec.写入 ...

  10. 认识STM32芯片

    STM32中的ST指的是意法半导体,M是Microelectronics的缩写,32表示32位,即意法半导体公司开发的32位微控制器 ST官网:https://www.st.com/content/s ...