PHP 反序列化漏洞

PHP反序列化漏洞在实际测试中出现的频率并不高,主要常出现在CTF中。

PHP序列化概述

PHP序列化函数:

  • serialize:将PHP的数据,数组,对象等序列化为字符串
  • unserialize:将序列化后的字符串反序列化为数据,数组,对象

serialize测试:

<?php
$a = array('a' => 'Apple','b' => false,'x' => 123);
$s = serialize($a);
echo $s;
?>

序列化后的字符串是明文的,只是使用一些代号来表示原来的数据。

测试反序列化:

<?php
$c = 'a:3:{s:1:"a";s:5:"Apple";s:1:"b";b:0;s:1:"x";i:123;}';
$d = unserialize($c);
var_dump($d);
?>

 

PHP反序列化漏洞

PHP反序列化漏洞就发生在对序列化后的数据进行反序列化的过程,由于反序列化会自动调用PHP的析构函数以及魔术方法,因而导致运行结果超出开发者的预期。

析构函数及魔术方法:

__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发

测试例子:

<?php
class Sec{
    public $m = 'user';
    function __wakeup(){
        system($this->m);
    }
}
//$o = unserialize($_GET['a']);
$a = 'a=O:3:"Sec":1:{s:1:"m";s:8:"ipconfig";}';
$o = unserialize($a);
?>

这种利用方式是基于系统中已经实现的类中析构函数或魔术方法,如果魔术方法中提供了system函数执行环境们就可以直接实现命令执行。倘若当前环境中没有类提供魔术方法,或者魔术方阿飞中没有危险的利用代码该怎么办?

还可以调用PHP原生类

其实PHP反序列化的利用方式并不止这些,后面先欠着,等有时间了再进行更新。这里只是先对PHP反序列化漏洞有个初步了解。

可参考文章:https://www.cnblogs.com/bmjoker/p/13742666.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dao-道法自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值