一、什么是序列化和反序列化:
1、序列化:
将对象的状态信息转换为可存储或传输的星时代的过程。
2、反序列化:
将可存储或传输的形式的过程恢复为对象的过程
3、存储格式:
二进制、XML、JSON
二、反序列化漏洞:
序列化与反序列化机制本身并无问题,但应用程序对于用户输入数据(不可信数据)进行了反序列化处理,使反序列化生成了非预期的对象,在对象的产生过程中可能产生攻击行为。
常见编程语言PHP、JAVA、Python中均具有反序列化问题,但由于JAVA的公用库,如Apache Commons Collections的广泛使用,导致WebLogic、webSphere、JBoss、Jenkins等应用均具有此漏洞。
三、PHP序列化与反序列化
首先在WWW目录下创建student.php文件:
<?php
class Student{
public $name;
public $age;
public function Say(){
echo 'Hello, I am '.$this->name. ', I am '.$this->age.' years old'.'<br />';
}
}
$s1 = new Student();
$s1->name = 'liming';
$s1->age = 44;
$s1->Say();
?>
执行结果为:
序列化:
PHP通过serialize进行序列化操作,保存对象以供以后使用:
<?php
class Student{
public $name;
public $age;
public function Say(){
echo 'Hello, I am '.$this->name. ', I am '.$this->age.' years old'.'<br />';
}
}
$s1 = new Student();
$s1->name = 'liming';
$s1->age = 44;
$s1->Say();
echo serialize($s1);
?>
执行结果为:
O:7:"Student":2:{s:4:"name";s:6:"liming";s:3:"age";i:44;}为序列化结果。
反序列化:
<?php
class Student{
public $name;
public $age;
public function Say(){
echo 'Hello, I am '.$this->name. ', I am '.$this->age.' years old'.'<br />';
}
}
$s2 = unserialize('O:7:"Student":2:{s:4:"name";s:6:"liming";s:3:"age";i:44;}');
$s2->Say();
$s3 = unserialize('O:7:"Student":2:{s:4:"name";s:5:"xuyin";s:3:"age";i:66;}');
$s3->Say();
?>
执行结果:
反序列化漏洞复现:
在www目录下创建log.php文件:
<?php
class LOG{
public $filename = 'access.txt';
function Write_log($text){
echo "access".$text;
file_put_contents($this->filename,$text,FILE_APPEND);
}
}
$log1 = new LOG();
$log1->Write_log('Sometimes your whole life boils down to one insane move.');
?>
执行结果为:
成功在www目录下创建文件
创建log1.php文件
<?php
class LOG{
public $filename = 'access.txt';
function Write_log($text){
echo "Delete".$text;
file_put_contents($this->filename,$text,FILE_APPEND);
}
}
$log2 = unserialize($_POST['s']);
$log2->Write_log('unserialize data!!!');
?>
执行代码:
access.txt文件被删除