不安全的反序列化

01 为什么要序列化

 

        序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”。在序列化期间内,将对象当前状态 写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重新创建该对象。

        简单的说,序列化就是把⼀个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台安全的 进⾏通信。

02 PHP 中的序列化与反序列化

        PHP 的反序列化漏洞也叫PHP 对象注⼊,是⼀个⾮常常⻅的漏洞,这种漏洞在某些场景下虽然有些难 以利⽤,但是⼀旦利⽤成功就会造成⾮常危险的后果。

        漏洞形成的根本原因就是程序没有对⽤户输⼊的反序列化字符串进⾏检测,导致反序列化过程可以被恶 意控制,进⽽造成代码执⾏、GetShell 等⼀系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存 在与Java、Python 语⾔中。其原理基本相同。

serialize();
unserialize();

        简单的例⼦ - JSON 数据

        JSON 是数据的⼀种表达形式,与Python ⾥的字典类似。

// json.php
//?name=ajest&age=18&sex=true&score=89.9
$stu = array(
 'name' => 'AJEST',
 'age' => 18,
 'sex' => true,
 'score' => 89.9
);
echo $stu;
echo "<hr />";
$stu_json=json_encode($stu);
echo $stu_json;
$stu_json_decode = json_decode($stu_json);
echo "<hr />";
var_dump($stu_json_decode);
echo "<hr />";
echo $stu_json_decode -> name;

        序列化Demo    

        #序列化与反序列化

                #  主要是针对对象

                抽象的数据结构 --序列化--> 字符串 --反序列化--> 抽象的数据结构

       #创建⼀个类

// stu.class.php
class Stu{
 public $name;
 public $age;
 public $sex;
 public $score;
}

        #创建对象

<?php
// serialize.php
include "stu.class.php";
$stu1 = new Stu();
$stu1 -> name = "AJEST";
$stu1 -> age = 24;
$stu1 -> sex = true;
$stu1 -> score = 99.9;
//var_dump($stu1);
//echo $stu1;
$stu1_ser = serialize($stu1);
echo $stu1_ser;
?>

          #序列化后的字符串

O:3:"Stu":4: {s:4:"name";s:5:"AJEST";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.90000 0000000006;}

         #反序列化

<?php
// unserialize.php
include "./stu.class.php";
if(!empty($_GET['obj'])){
 $str = $_GET['obj'];
}else{
 $str = 'O:3:"Stu":4:
{s:4:"name";s:5:"AJEST";s:3:"age";i:18;s:3:"sex";b:1;s:5:"score";d:89.9000
00000000006;}';
}
echo $str;
echo "<hr />";
$stu1 = unserialize($str);
//echo $stu1;
var_dump($stu1);
?>

3 漏洞何在?

        

<?php
// stu.class.php
class Stu{
 public $name;
 public $age;
 public $sex;
 public $score;
}
?>
<?php
 //vul.php
include "vul.class.php";
$test = new Test();
echo serialize($test);
echo "<hr />";
$test = unserialize(@$_GET['obj']);
var_dump($test);
?>

反序列化执⾏代码

O:4:"Test":1:{s:3:"str";s:5:"AJEST";}
O:4:"Test":1:{s:3:"str";s:12:"dnsec.com.cn";}
O:4:"Test":1:{s:3:"str";s:10:"phpinfo();";}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值