php程序吧 关注:1,165贴子:236
  • 2回复贴,共1

PHP对象注入的实例分析

只看楼主收藏回复

PHP对象注入的实例分析


1楼2019-10-19 14:42回复
      1. 写在前面
      最近经常会遇到一些比较有意思的漏洞,比如PHP反序列化漏洞,PHP对象注入。这些漏洞可能在平时很难遇到,但是在CTF以及一些CMS倒是经常看到他们的背影。今天刚刚好手上看到了某CTF的代码,但是并没有获取所有源码,因此修改了部分代码进行分析。


    2楼2019-10-19 14:43
    回复
        2. 自动加载
        2.0 为什么要自动加载?
        在面向对象编程中,程序员经常会编写好类然后在一个入口文件中将它们包含进来。如果一个项目非常大,可能存在成百上千个类文件,如果一一包含进去,那么入口文件就会显得特别大并且不利于维护。因此,PHP5提供了一种自动加载机制。
        2.1 __autoload
        index.php
        function __autoload($classname){
        $class_file = strtolower($classname)。".php";
        if(file_exists($class_file)){
        require_once("$class_file");
        }else{
        echo "$class_file does not exist!";
        }
        }
        $obj = new File();
        访问index.php,程序会尝试实例化File类。PHP的解析器会自动调用__autoload()函数。假设当前目录下没有file.php,那么就会输出 “file.php does not exist!” 并且抛出错误。
        file.php
        class File{
        function __construct(){
        echo "File class is instantiated";
        }
        }
        此时访问index.php,就会得到 “File class is instantiated” 的结果。这样一来,自动加载机制就非常好理解了。
        2.2 手动调用 spl_autoload
        void spl_autoload ( string $class_name [, string $file_extensions ] )
        它可以接收两个参数,第一个参数是$class_name,表示类名。第二个参数$file_extensions是可选的,表示类文件的扩展名;如果不指定的话,它将使用默认的扩展名。inc或。php。
        spl_autoload首先将$class_name变为小写,然后在所有的include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions参数的话),如果找到,就加载该类文件。
        同样,你可以手动使用spl_autoload(“Person”, “。class.php”)来加载Person类。实际上,它跟require/include差不多
        举个例子
        spl_autoload("upload");
        $F = new Upload();
        这里没有指定扩展名,那么就会在当前目录下寻找upload.inc或者upload.php并自动加载。其实,到这里而言,和require、include相比并没有简单。相反,它们的功能基本是一模一样的。
        2.3 自动调用 spl_autoload
        上面所说的使用手动的方式调用spl_autoload,工作量其实和require/include基本上差不多。调用spl_autoload_register()的时候,如果没有指定欲注册的自动装载函数,则自动注册 autoload 的默认实现函数spl_autoload()。
        举个例子
        spl_autoload_register();
        $F = new Upload();
        此时,程序会在当前路径下自动加载upload.inc或upload.php。
       


      3楼2019-10-19 14:44
      回复