PHP代码审计 11 反序列化漏洞

本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程

PHP 代码审计博客目录

1. 简介

  1. 漏洞生成条件
    1.unserialize 函数的参数可控
    2.脚本中存在一个构造函数。析构函数、——wakeup函数中有类

    1. 对象中的成员变量的值
  2. 解释

    php允许保存一个对象方便以后重用,这个过程被称为序列化。为什么要有序列化这种机制呢?在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果为一个脚本中想要调用之前一个脚本的变量,但是前一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本调用?这肯定是不现实的。serialize和unserialize就是用来解决这一问题的。serialize可以将变量转换为字符串并且在转换中可以保存当前变量的值;unserialize则可以将serialize生成的字符串变换回变量。

    漏洞名称的由来:在变量可控并且进行了unserialize操作的地方注入序列化对象,实现代码执行或者其它坑爹的行为。

2. 测试

  1. 生成序列化的值

    <?php
    class demo{
        var $test="phpinfo();";
    }
    $class = new demo();
    print_r(serialize($class));
    ?>
    

    浏览器执行 http://127.0.0.1/test.php

    结果为 O:4:”demo”:1:{s:4:”test”;s:10:”phpinfo();”;}

  2. 测试漏洞

    <?php
    class demo{
        var $test="moonsec";
        function __destruct(){
            eval($this->test);
        }
    }
    unserialize($_GET['code']);
    ?>
    

    浏览器执行 http://127.0.0.1/test.php?code=O:4:%22demo%22:1:{s:4:%22test%22;s:10:%22phpinfo();%22;}

    将上述序列化的值放在 URL 中,即可得出结果

  3. 上述需要的 php 基础知识

    php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。为了更好的理解magic方法是如何工作的,在2.php中增加了三个magic方法,__construct, __destruct和__toString。可以看出,__construct在对象创建时调用,__destruct在php脚本结束时调用,__toString在对象被当作一个字符串使用时调用。

猜你喜欢

转载自blog.csdn.net/kevinhanser/article/details/81146089