PHP反序列化漏洞总结
写在前边
做了不少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反序列化漏洞总结的更多相关文章
- 反序列化漏洞问题研究之php篇
php的反序列化反序列化漏洞又称php对象注入(php Object Injection)产生的问题主要分以下两类: 将传来的序列化数据直接unserilize,造成魔幻函数的执行.这种情况在一般的应 ...
- Weblogic反序列化漏洞补丁更新解决方案
Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...
- Java反序列化漏洞执行命令回显实现及Exploit下载
原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...
- Java反序列化漏洞通用利用分析
原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- 小白审计JACKSON反序列化漏洞
1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.or ...
- 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月份补丁. 一.查看版本 ...
- weblogic AND jboss 反序列化漏洞
C:\Program Files\Java\jboss-4.2.3.GA\server\default\deploy\http-invoker.sar\invoker.war\WEB-INF serv ...
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- java反序列化漏洞实战
准备: 域名一个,用于增加NS解析,判断是否存在反序列化漏洞. 公网IP服务器一台,用于搭建DNS代理,抓包判断. dnschef,DNS代理 ysoserial.jar生成payload. 简单的p ...
随机推荐
- Mysql性能优化:为什么你的count(*)这么慢?
导读 在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了 sql 中的count函数. 但是随着记录越来越多,查询的速度会越来越慢,为什么会这样呢?M ...
- VS2015 Visual Assist X 破解版安装教程
前言 此方法适合VS2010~VS2015版本. 安装包下载方法:公众号[视觉IMAX]后台回复「VA助手」,即可得到安装包下载链接. 工作以来,一直在使用VS2015,之前一直根据的网上飘云阁的破解 ...
- eureka和zookeeper注册中心的区别
ookeeper与Eureka区别 CPA理论:一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡. ...
- DNS 域名解析
DNS域名解析 整个过程大体描述如下,其中前两个步骤是在本机完成的,后8个步骤涉及到真正的域名解析服务器:1.浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束. ...
- 树莓派 zeroWH 使用笔记
更新raspbian apt-get update apt-get upgrade 删除python2 sudo rm /usr/bin/python安装python3 sud ...
- 关于 JavaScript 的 精度丢失 与 近似舍入
一.背景 最近做 dashborad 图表时,涉及计算小数且四舍五入精确到 N 位.后发现 js 算出来的结果跟我预想的不一样,看来这里面并不简单-- 二.JS 与 精度 1.精度处理 首先明确两点: ...
- 用c#判断回文数和降序数
题目:编一个程序,输入一个正整数,判定它是否为回文数和降序数.当输入的数为0时,则退出程序,否则继续循环执行程序. 所谓“降序数”是指一个自然数的低位数字不大于高位数字的数.例如: 64, 55, 3 ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- 为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生【宇哥带你玩转MySQL 索引篇(二)】
为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生 在上一节,我们聊到数据库为了让我们的查询加速,通过索引方式对数据进行冗余并排序,这样我们在使用时就可以在排好序的数据里进行快速的二分查找,使得查 ...
- Centos装机预备技能
装机预备技能 1.1问题 本例要求安装一台可用的KVM服务器: RHEL与Cent ...