无锡建站模板系统,德宏北京网站建设,东莞做网站哪个公司好,青岛君哲网站建设公司怎么样文章目录 1、序列化与反序列化1.1、引入1.2、序列化实例1.2.1、定义一个类1.2.2、创建 对象1.2.3、反序列化1.2.4、对象注入 2、漏洞何在2.1、漏洞触发2.1.2、定义一个类2.1.3、定义一个对象2.1.3、反序列化执行代码 2.2 为什么会这样 3、反序列化漏洞攻防3.1、PHP反序列化实例… 文章目录 1、序列化与反序列化1.1、引入1.2、序列化实例1.2.1、定义一个类1.2.2、创建 对象1.2.3、反序列化1.2.4、对象注入 2、漏洞何在2.1、漏洞触发2.1.2、定义一个类2.1.3、定义一个对象2.1.3、反序列化执行代码 2.2 为什么会这样 3、反序列化漏洞攻防3.1、PHP反序列化实例3.2、Java反序列化实例3.3、反序列化漏洞防御 为什么要序列化
序列化“将对象的状态信息转换为可以存储或传输的形式的过程”这种形式⼤多为字节流、字符串、json 串。在序列化期间内将对象当前状态写⼊到临时或永久性的存储区。以后就可以通过从存储区中读取或还原反序列化对象的状态重新创建该对象。简单的说序列化就是把⼀个对象变成可以传输的字符串可以以特定的格式在进程之间跨平台安全的进⾏通信。
1、序列化与反序列化
以PHP 语⾔为例
1.1、引入
JSON 数据是数据的⼀种表达形式与Python ⾥的字典类似
?php
// json.php
$stu array(name JayChou,age 18,sex true,score 89.9
);
// echo $stu;
// var_dump($stu);
$stu_json json_encode($stu);
echo $stu_json;
echo hr /;
$stu_json isset($_GET[stu])?$_GET[stu]:$stu_json;
$stu json_decode($stu_json);
var_dump($stu);
?验证
?stu{name:jaychou,age:19,sex:true,score:89.9}1.2、序列化实例
1.2.1、定义一个类
?php// stu.class.phpclass Stu{public $name;public $age;public $sex;public $score;}
?1.2.2、创建 对象
创建⼀个对象并对该对象进⾏序列化操作将对象转化为可以存储、传输的字符串
?php
//serialize.php
include ./stu.class.php;$stu1 new Stu();$stu1-name JayChou; #$stu1.name
$stu1-age 18;
$stu1-sex true;
$stu1-score 68.99;//echo $stu1; 报错
// var_dump($stu1)$_stu1 serialize($stu1);
echo $_stu1;
?序列化后的字符串
O:3:Stu:4:{s:4:name;s:7:JayChou;s:3:age;i:18;s:3:sex;b:1;s:5:score;d:68.989999999999995;} 1.2.3、反序列化
将字符串转化为对象
?php// unserialize.phpinclude ./stu.class.php;$stu1_ser O:3:Stu:4:{s:4:name;s:7:JayChou;s:3:age;i:18;s:3:sex;b:1;s:5:score;d:68.989999999999995;} ;$stu1_obj unserialize($stu1_ser);var_dump($stu1_obj);
? 1.2.4、对象注入
如果反序列化字符串Web ⽤⼾可以控制则造成对象注⼊。
?php// unserialize.phpinclude ./stu.class.php;// $stu1_ser O:3:Stu:4:{s:4:name;s:7:JayChou;s:3:age;i:18;s:3:sex;b:1;s:5:score;d:68.989999999999995;} ;$stu1_ser $_GET[obj]; #动态传参$stu1_obj unserialize($stu1_ser);var_dump($stu1_obj);
?PHP 的反序列化漏洞也叫PHP 对象注⼊是⼀个⾮常常⻅的漏洞这种漏洞在某些场景下虽然有些难以利⽤但是⼀旦利⽤成功就会造成⾮常危险的后果
2、漏洞何在
2.1、漏洞触发
2.1.2、定义一个类
?php
// vul.class.phpclass Vul{public $str JayChou;function __destruct(){eval($this - str);}
}
?2.1.3、定义一个对象
?php
// test.php
include ./vul.class.php;$s new Vul();
echo serialize($s);
echo hr /;$_s isset($_GET[s_ser])?$_GET[s_ser]:O:3:Vul:1:{s:3:str;s:7:JayChou;};$s unserialize($_s);
var_dump($s);
?序列化后
O:3:Vul:1:{s:3:str;s:7:JayChou;}反序列化后
object(Vul)#2 (1) { [str] string(7) JayChou } 2.1.3、反序列化执行代码
?s_serO:3:Vul:1:{s:3:str;s:10:phpinfo();;}2.2 为什么会这样
__destruct()会被对象⾃动调⽤。
以__开头的函数是PHP 中的魔术⽅法。类中的魔术⽅法在特定情况下会⾃动调⽤。即使魔术⽅法在类中没有被定义也是真实存在的
魔术方法触发条件__construct()在创建对象时⾃动调⽤构造函数__destruct()在销毁对象时⾃动调⽤析构函数
__call();
__callStatic();
__get();
__set();
__isset();
__unset();
__sleep();
__wakeup(); 创建对象之前触发。
__toString();
__invoke();
__set_state();
__clone();
__debuginfo();漏洞形成的根本原因就是程序没有对⽤⼾输⼊的反序列化字符串进⾏检测导致反序列化过程可以被恶意控制进而造成代码执⾏、GetShell 等⼀系列不可控的后果。反序列化漏洞并不是PHP 特有的也存在于Java、Python 语⾔中其原理基本相同
3、反序列化漏洞攻防
3.1、PHP反序列化实例
博客跳转
3.2、Java反序列化实例
Weblogic 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞CVE-2017-10271S2-045 Remote Code Execution VulnerablityCVE-2017-5638JBoss 5.x/6.x 反序列化漏洞CVE-2017-12149fastjson 1.2.24 反序列化导致任意命令执行漏洞Fastjson 1.2.47 远程命令执行漏洞Apache Shiro 1.2.4反序列化漏洞CVE-2016-4437
3.3、反序列化漏洞防御
升级组件到最新版本⿊⽩名单过滤敏感字符禁⽤反序列化功能部署安全设备