代码编织梦想

写在前边

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

1.面向对象

2.PHP序列化和反序列化

3.PHP反序列化漏洞实例

1.面向对象

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

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

classPeople

{//声明属性

public $name;//声明方法

public functioneat()

{echo $this->name."在吃饭";

}

}

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

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

完整代码

{public $name;public functioneat()

{echo $this->name."在吃饭";

}

}$people_1 = newPeople();$people_1->name = '张三';$people_1->Eat();?>

效果:

5802fb01511f3124478afa9c90845140.png

2.PHP序列化和反序列化

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

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

{public $name;public $age; //新加属性

public functionEat()

{echo $this->name."在吃饭";

}

}$people_1 = newPeople();$people_1->name = '张三';$people_1->age = 18;$people_1->Eat();//序列化

echo serialize($people_1);?>

效果:

7dde866086f703415481febea2a328f4.png

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

{public $name;public $age;public functioneat()

{echo $this->name."在吃饭";

}

}//重建对象

$usr = unserialize('O:6:"People":2:{s:4:"name";s:6:"张三";s:3:"age";i:18;}');//输出

$usr->eat();?>

效果:

1f7d15b7174187f309eca5d756f56e55.png

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

3.PHP反序列化漏洞

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

该漏洞需要有以下条件:

1.unserialize函数的参数可控

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

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

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

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

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

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

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

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

创建test3.php

<?phpclassTest {var $test = "123";function__wakeup(){$fp = fopen("test.php", 'w');fwrite($fp, $this ->test);fclose($fp);

}

}$test1 = $_GET['test'];print_r($test1);echo "
";$seri = unserialize($test1);require "test.php";?>

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

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

eae71f3bef8b50715cd627162a13d5db.png

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

<?phpclassTest {var $test = "123";function__wakeup(){$fp = fopen("test.php", 'w');fwrite($fp, $this ->test);fclose($fp);

}

}$test = newTest();echo serialize($test);?>

38b19765ef2df81aabea25530b35a9fe.png

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

e0dcb5f90a12cdce09c57ad0623b06a8.png

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

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

参考

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

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

如有错误还请指出,谢谢

php反序列化漏洞学习总结_brucetg的博客-爱代码爱编程

  一直以来总是觉得对PHP反序列化漏洞的理解比较模糊,今天抽时间深入学习下PHP反序列化漏洞的成因以及利用方式,在此做一个总结。    参考链接:              http://bobao.360.cn/learning/detail/3193.html       http://blog.csdn.net/qq_32400

PHP反序列化漏洞-CTF实例-爱代码爱编程

PHP反序列化漏洞-CTF PHP反序列化漏洞-FIRST PHP反序列化漏洞-SECOND 1.CTF实例 CTF实例源码:strchr() 函数: 搜索字符串在另一字符串中的第一次出现,返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 FALSE。dirname(__FILE__)函数:表示当前文件绝对路径 //10.php

PHP序列化反序列化漏洞总结(一篇懂)-爱代码爱编程

文章目录 序列化和反序列化的概念与基础知识PHP的序列化访问控制修饰符PHP的反序列化反序列化POP链PHP反序列化漏洞(常规)绕过魔法方法的反序列化漏洞__wakeup()__destruct()示例一:示例二(连菜刀、反序列化免杀后门):__toString()Error类ExceptionPHP中Session反序列化(重点)简介与基础知识S

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

文章目录 一、介绍1.1 漏洞原理1.2 影响版本二、漏洞复现2.1 配置环境2.2 漏洞复现三、防御措施 一、介绍 1.1 漏洞原理   PHP5.6.13前的版本在读取存储好的session时,如果反序列化出错则会跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中,编码是utf8,当我们插入4

php反序列漏洞 实例_PHP反序列化漏洞原理及示例-爱代码爱编程

文章目录 序列化与反序列化 PHP魔法函数 反序列化漏洞 简介 原理 触发条件 示例 PHP反序列化 PHP反序列化 序列化与反序列化 序列化说通俗点就是把一个对象变成可以传输的字符串。 序列化过程中还会对不同属性的变量进行不同方式的变化 public的属性在序列化时,直接显示属性名 protected的属性在序列化时,会在

php反序列化漏洞 freebuf,PHP反序列化漏洞进阶之Session反序列化漏洞-爱代码爱编程

什么是session session英文翻译为"会话",两个人聊天从开始到结束就构成了一个会话。PHP里的session主要是指客户端浏览器与服务端数据交换的对话,从浏览器打开到关闭,一个最简单的会话周期 PHP session工作流程 会话的工作流程很简单,当开始一个会话时,PHP会尝试从请求中查找会话 ID (通常通过会话 cookie),如

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

最近和小伙伴们一起研究了下PHP反序列化漏洞,突发奇想,利用反序列化漏洞写一个一句话木马效果应该蛮不错的。本文主要和大家分享PHP反序列化漏洞详解,希望能帮助到大家。 0x01 PHP反序 说起PHP反序列化,那必须先简单说一下PHP的序列化。PHP序列化是将一个对象、数组、字符串等转化为字节流便于传输,比如跨脚本等。而PHP反序列化是将序列化之后