PHP serialize && unserialize Security Risk Research(undone)

目录

1. 序列化的定义
2. serialize:序列化
3. unserialize:反序列化
4. 序列化、反序列化存在的安全风险

1. 序列化的定义

序列化在计算机科学中通常有以下定义:

1. 对同步控制而言,表示强制在同一时间内进行单一存取
2. 在数据储存与传送的部分是指将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等,或者透过网络传送资料时进行编码的过程,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这程序被应用在不同应用程序之间传送对象,以及服务器将对象储存到档案或数据库。相反的过程又称为反序列化 

序列化有多个优点

1. 一个简单和持久的方法使对象持续
2. 一个发起远程过程调用的方法,例如在SOAP内的
3. 一个分发对象的方法,尤其是在如COM及CORBA的软件组件化内

Relevant Link:

http://zh.wikipedia.org/wiki/%E5%BA%8F%E5%88%97%E5%8C%96
http://baike.baidu.com/view/160029.htm

2. serialize:序列化

serialize: 产生一个可存储的值的表示
serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。这有利于存储或传递 PHP 的值,同时不丢失其类型和结构
serialize() 可处理除了 resource 之外的任何类型,包括

1. 指向其自身引用的数组
2. serialize() 的数组/对象中的引用也将被存储(引用本身也会被序列化)
3. ...

从本质上来讲,序列化的过程是一个"对象(广义上的对象,包括integer、float、string、array、object)"进行"对象销毁",然后转换为一个通用的中间可存储字符串,在整个序列化过程中,对象经历的声明周期如下

1. __sleep(): 在执行对象销毁前获得执行权限
2. __destruct():执行实际的对象销毁操作

code

<?php
    class Connection
    {
        var $protected_var;
        var $private_var;

        public function __construct($server, $username, $password, $db)
        {
            echo "function __construct() is called" . "</br>";
            $this->protected_var = "protected_var";
            $this->private_var = "private_var";
        }

        function __destruct()
        {
            echo "function __destruct() is called" . "</br>";
           }

        public function __sleep()
        {
            echo "function __sleep() is called" . "</br>";
        }

        public function __wakeup()
        {
            echo "function __wakeup() is called" . "</br>";
        }
    }

    //initialize a var
    $obj = new Connection();

    //var_dump($obj);

    $result = serialize($obj);

    //var_dump($result);

    unserialize($result);
?>

Relevant Link:

http://php.net/manual/zh/function.serialize.php
http://php.net/manual/zh/language.oop5.magic.php#object.wakeup
http://php.net/manual/zh/language.oop5.decon.php

3. unserialize:反序列化

从已存储的表示中创建 PHP 的值
unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值

在反序列化中,经历的对象声明周期为

1. __construct():执行对象注册、包括对象中成员的注册
2. __wakeup:在构造函数执行后获得执行权限

Relevant Link:

http://php.net/manual/zh/function.unserialize.php

4. 序列化、反序列化存在的安全风险

0x1: 对象注入

<?php
    #GOAL: get the secret;

    class just4fun
    {
        var $enter;
        var $secret;
    }

    if (isset($_GET[‘pass‘]))
    {
        $pass = $_GET[‘pass‘];

        if(get_magic_quotes_gpc())
        {
        $pass=stripslashes($pass);
        }

        $o = unserialize($pass);

        if ($o)
        {
        $o->secret = "?????????????????????????????";
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else
            echo "Oh no... You can‘t fool me";
        }
        else echo "are you trolling?";
    }
?>

serialize一个just4fun的对象,序列化之前先进行引用赋值

$o->enter = &$o->secret

0x2: PHP Session 序列化及反序列化处理器

http://drops.wooyun.org/tips/3909

0x3: 基于序列化、反序列化的Webshell隐藏技巧

http://www.cnblogs.com/LittleHann/p/3522990.html
搜索:0x22: PHP的序列化、反序列化特性布置后门 

Relevant Link:

http://drops.wooyun.org/papers/660

Copyright (c) 2014 LittleHann All rights reserved

时间: 2024-10-27 19:10:29

PHP serialize && unserialize Security Risk Research(undone)的相关文章

PHP Datatype Conversion Safety Risk、Floating Point Precision、Operator Security Risk、Safety Coding Principle

catalog 0. 引言 1. PHP operator introduction 2. 算术运算符 3. 赋值运算符 4. 位运算符 5. 执行运算符 6. 递增/递减运算符 7. 数组运算符 8. 类型运算符 9. PHP自动类型转换 10. 浮点数运算中的精度损失 11. 比较运算符 0. 引言 本文试图讨论PHP中因为运算符导致的各种安全问题/风险/漏洞,其他很多本质上并不能算PHP本身的问题,而更多时候在于PHP程序员对语言本身的理解以及对安全编码规范的践行,我们逐个讨论PHP中的运

php serialize unserialize–数据序列化与反序列化的应用

序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得. 用一个类的时候都是new一下!如果serialize 将数据序列化以后存到数据库中等 用的时候就不再new了 反序列化以后就可以直接用了!相当于new了一下!用例子给你说明一下! 如: a.php 1 <?php 2 //声明一个类 3 class dog { 4 var $name; 5 var $age; 6 var $owner; 7 function dog($in_name="unnamed",

php -- 用文本来存储内容,file_put_contents,serialize,unserialize

根据存储的内容来划分 字符串: file_put_contents :将一个字符串写入文件 语法:int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource$context ]] ) 参数 filename:要被写入数据的文件名. data:要写入的数据.类型可以是 string,array 或者是 stream 资源(如上面所说的那样). 如果 data 指定为 stream 资源,这

Cookies, Security, and Privacy Client Identification

w HTTP The Definitive Guide Cookies themselves are not believed to be a tremendous security risk, because they can be disabled and because much of the tracking can be done through log analysis or other means. In fact, by providing a standardized, scr

由数据库某字段存数组引发的json_encode/serialize思考

导火索场景: 原来:mysql中 result表 img字段原存储字符串,内容为某图片链接: 现在:该字段需要存储多张图片链接,1-3个元素行程的数组: google得到的普遍建议有两种:https://stackoverflow.com/questions/3413291/how-to-store-an-array-into-mysql 建议一:根据具体场景构建多张表,通过主键外键形成关联. 优点:支持针对数组中某个字段的查询等:缺点:需要结合具体场景 建议二:序列化数组,php提供内置方法支

PatentTips - Improving security in a virtual machine host

BACKGROUND Computer viruses are a common problem for computer users. One typical mode of attack is to send an electronic mail message (e-mail) containing a file attachment to an unsuspecting user's computer. The file attachment contains malicious att

1-1789端口

Port#Port Keyword Port Description0 Reserved1 tcpmux TCP Port Service Multiplexer2 compressnet Management Utility3 compressnet Compression Process5 rje Remote Job Entry7 echo Echo9 discard Discard11 systat Active Users13 daytime Daytime (RFC 867)1517

C++ Core Guidelines

C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very early draft. It is inkorrekt, incompleat, and pµøoorly formatted. Had it been an open source (code) project, this would have been release 0.6. Copy

信息安全管理(2):什么叫作信息安全?信息安全的原则和要求

这个章节将简单介绍一些信息安全的基本概念和原则.包括安全缺陷(Vulnerabilities)的检测,安全威胁(threats)的类别,数据安全的要求,和数据安全的防御措施. 1 信息安全的基本原则(碎碎念的概念) 作为一个计算机安全的专家,在学习技术领域的知识之前,他必须也要先理解那些重要的信息安全的原则!!!Computer security specialists must not only know the technical side of their jobs but also mu