代码编织梦想

1 简介

  1. PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。
  2. 漏洞形成的根本原因是程序没有对用户输入的反序列化字节流进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、GetShell等一系列不可控的后果。(在反序列化过程中,会触发代码执行。)
  3. 反序列化漏洞并非是PHP所特有的,也存在与java、Python等语言中,原理基本相同。

2 PHP反序列化漏洞

2.1 测试环境

  1. 服务器:在虚拟机中安装win2008及phpstudy,参考《win2008R2SP1+WAMP环境部署》。
  2. 客户端:真实机浏览器。

2.2 测试过程

  1. 在服务器根目录下,新建txt文件,输入以下内容,并另存为test.php。
<?php
class test{
	public $str='libai;';
	function __destruct(){
		echo "This is function __construct()";
		@eval($this->str);
	}
}
$test1 = new test();
echo serialize($test1);
echo "<hr>";
$t = $_GET['obj'];
var_dump(unserialize($t));
?>
  1. 浏览器访问该网页,攻击者构造输入参数?obj=O:7:"payload":1:{s:4:"name";s:10:"phpinfo();";},网页显示如下,可以看到phpinfo()函数被成功执行。
    在这里插入图片描述
  2. 将test.php文件修改如下,将新建test类对象的语句注释掉,再次实验。
<?php
class test{
	public $str='libai;';
	function __destruct(){
		echo "This is function __construct()";
		@eval($this->str);
	}
}
//$test1 = new test();
//echo serialize($test1);
//echo "<hr>";
$t = $_GET['obj'];
var_dump(unserialize($t));
?>
  1. 同样的参数访问,网页显示如下,可以看到同样能执行phpinfo()函数,因此可以判断输入对象成功反序列化为test类对象,并自动执行了__destruct()函数。
    在这里插入图片描述
  2. 将test.php文件修改如下,将最后一行语句修改如下,再次实验。
<?php
class test{
	public $str='libai;';
	function __destruct(){
		echo "This is function __construct()";
		@eval($this->str);
	}
}
//$test1 = new test();
//echo serialize($test1);
//echo "<hr>";
$t = $_GET['obj'];
$t = unserialize($t);
?>
  1. 同样的参数访问,网页显示如下,可以看到同样能执行phpinfo()函数,因此可以判断输入对象成功反序列化为test类对象,并自动执行了__destruct()函数。
    在这里插入图片描述
  2. 我们发现,当销毁实例化类的时候,__destruct()函数会被自动调用,并输出字符串This is function __destruct()。
  3. 默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,__destruct()允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,__destruct()将被调用.,在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。

3 PHP魔术方法归纳

  1. 以 __ 开头的的方法,是PHP中的魔术方法,在特定情况下会被自动调用。主要魔术方法如下:
魔术方法触发条件
__construct()构造方法,当一个对象被创建时调用此方法.
__destruct()析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
__autoload()使用尚未被定义的类时自动调用。通过此函数,
脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
__call( $method, $arg_array )在对象中调用一个不可访问方法时
__callStatic()在静态上下文中调用一个不可访问的方法时使用
__clone()使用clone方法复制一个对象时
__invoke()当尝试调用函数的方式调用一个对象时
__get( $property )当调用一个未定义的属性时访问此方法
__set( $property, $value )给一个未定义的属性赋值时调用
__isset( $property )当在一个未定义的属性上调用isset()函数时调用此方法
__unset( $property )当在一个未定义的属性上调用unset()函数时调用此方法
__toString()在将一个对象转化成字符串时自动调用
__sleep()串行化的时候用,详见补充说明
__wakeup()反串行化的时候调用,详见补充说明
__set_state()当调用var_export()时,这个静态方法会被调用
__invoke()当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用
  1. __sleep()和__wakeup()的补充说明
    1. serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
    2. 使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
    3. 相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
    4. 使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

4 总结

  1. 理解PHP反序列化漏洞的触发原理;
  2. 了解PHP相关的魔术方法及调用情况。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Fighting_hawk/article/details/123598709

PHP反序列化漏洞——漏洞原理及防御措施-爱代码爱编程

序列化   将对象转换成字符串 反序列化 将特定格式的字符串转换成对象什么是反序列化漏洞 PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程

反序列化漏洞分析讲解-爱代码爱编程

一、什么是反序列化 1.1 漏洞简介 PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存

python pickle反序列化漏洞_(Python)cPickle反序列化漏洞-爱代码爱编程

基本概念 Python中有个库可以实现序列化和反序列化操作,名为pickle或cPickle,作用和PHP的serialize与unserialize一样,两者只是实现的语言不同,一个是纯Python实现、另一个是C实现,函数调用基本相同,但cPickle库的性能更好,因此这里选用cPickle库作为示例。 cPickle可以对任意一种类型的Pyt

php反序列化java_PHP反序列化漏洞简介及相关技巧小结-爱代码爱编程

*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径 要学习PHP反序列漏洞,先了解下PHP序列化和反序列化是什么东西。 php程序为了保存和转储对象,提供了序列化的方法,php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。 php序列化的函数为serialize。

php+反序列化代码执行漏洞,PHP反序列化漏洞-爱代码爱编程

0x001 漏洞产生原理 在反序列化的过程中自动触发了某些魔术方法。未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致XSS、代码执行、文件写入、文件读取等不可控后果。 0x002 漏洞触发条件 一般只能通过代码审计的方式挖掘该漏洞,寻找代码中unserialize()函数的变量可控,且PHP文件代码中存在可利用的类,同

php反序列化漏洞原理,PHP反序列化漏洞原理与复现-爱代码爱编程

php反序列化漏洞,又叫php对象注入漏洞 序列化与反序列化 serialize() 当在php中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。测试代码如下; class chybeta{ var $test = '123'; } $class1 = new chybeta;

php反序列化漏洞原理,PHP反序列化原理及漏洞解析-爱代码爱编程

什么是PHP序列化 PHP序列化与反序列化的过程 一个反序列化漏洞的例子 CVE-2016-7124 一. 什么是PHP序列化与反序列化 1. PHP序列化 PHP序列化是指把变量转化成可保存或传输的字符串的过程,PHP序列化函数有serialize、json_encode。 以下例子可以实现PHP序列化 1 2 3 4 5

php 序列化漏洞,PHP反序列化漏洞成因及漏洞挖掘技巧与案例 | ADog's Blog-爱代码爱编程

最近在深入研究php的反序列化,觉得Test404这篇可能是同类当中写的最好的,不过不知道这篇出处是不是360的。。在这里转载一下以便新人学习~ 翻译:hac425 一、序列化和反序列化 序列化和反序列化的目的是使得程序间传输对象会更加方便。序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换

ctf+php反序列化,CTF中的PHP反序列化漏洞简单分析-爱代码爱编程

本帖最后由 icq_8bf67fe65 于 2018-9-2 21:20 编辑 本文原创作者:Versi0n,本文属i春秋原创奖励计划,未经许可禁止转载! 一、前言 在ctf比赛中,经常会遇到php反序列化漏洞的题,今天就来简单分析下该漏洞的正确食用姿势~ 二、正文 1.基础知识PHP序列化:php为了方便进行数据的传输,允许把复杂的数据结构

详解PHP反序列化漏洞-爱代码爱编程

详解PHP反序列化漏洞 序列化与反序列化定义常见使用情况常见的序列化格式反序列化中常见的魔术方法反序列化绕过protected和private绕过__wakeup绕过(CVE-2016-7124)引用利用16进制绕过字符过滤同名方法的利用绕过部分正则字符逃逸字符增多字符减少对象注入session反序列化漏洞session定义PHP session工

反序列化漏洞汇总-爱代码爱编程

反序列化漏洞汇总 PHPJAVAApache Shiro 反序列化weblogic反序列化漏洞fastjsonTomcat反序列化ApacheJBoss反序列化漏洞 原理:在反序列化的过程中,将字节流转化为对象。在此过程,由于输入不可控,并且后端对用户输入过滤不严格,攻击者通过构造恶意输入,在反序列化后,调用魔术方法执行任意恶意代码,产生非预期

一文解读,网络安全行业人才需求情况《网络安全产业人才发展报告》-爱代码爱编程

随着近几天国家网络安全宣传周在全国各地开展活动,网络安全再一次成为热门话题。网络安全不再缩在小小的安全圈子里,惠及面越来越广。不少对网络安全颇有兴趣的朋友非常关心行业前景如何?该怎么提升自我能力,更快地加入网安行列。 今天雨笋君就10月13日在网络安全宣传周上发布的《2021网络安全人才报告》进行一个简单的行业前景分析。   一、网络安全行业

反序列化漏洞总结-爱代码爱编程

目录 1.了解序列化和反序列化 2.php反序列化和序列化 2.1无类序列化和反序列化演示 2.2有类序列化和反序列化演示 2.2.1类的理解  2.2.2有类序列化过程 2.2.3有类反序列化过程  3.魔法方法 4.简单案列 4.1__wakeup()反序列化案列 4.2.pikachu的反序列漏洞案列 4.3其他函数利用 5