2025年4月11日 星期五 乙巳(蛇)年 正月十二 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 安全防护

PHP 反序列化漏洞

时间:10-14来源:作者:点击数:36

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原生类

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门