spl_autoload_register 和上传结合带来的安全问题

spl_autoload_register方法

当实例化对象的时候, 使用的类不存在, 就会执行该方法, 跟他类似的还有

__construct 实例化对象的时候会被自动加载

__destruct 执行结束后会被自动加载

__call 试图在类外调用一个不存在的方法的时候会被自动加载

__set 调用设置的时候会被自动加载

__get 试图在类外获取私有属性时,会被自动加载

今天主要讲的是 spl_autoload_register

前面说了该方法的含义就不再重复了, 来看一段代码

<?php

class ttt
{
    static function tta()
    {
        ;
    }
}

spl_autoload_register();
$a = new xxx;

?>

如果有人告诉你, 请找出该段代码存在的安全问题, 如果对代码不熟的话,你可能会觉得他是在跟你开玩笑, 实际上是没有开玩笑的, 本节的重点就在

spl_autoload_register();

前面我们知道了, 该方法会在当实例化类不存在的时候, 自动运行, 我们又知道了在该方法参数为空的时候, 他会自动去寻找目录下的实例化对象类名.php, 或者实例化对象类名.inc 于是这个时候漏洞就产生了,首先我们构造一个场景,然后再来看代码

一处文件上传, 过滤了php,jsp,aspx,php1,php2,jspx等常见的脚本名称后缀,但是没有处理.inc, 于是这个时候, 我们上传一个包含 eval() 代码的.inc文件进去, 就得到了一个包含恶意文件.inc的url地址, 这个时候, 如果我们可以控制实例化对象名为我们的上传文件名, 于是这个时候漏洞出现了, .inc里的代码被以php方式执行。

继续来看一下代码

首先, 我们新建了一个类, 类名为ttt, 然后在类里新建了一个静态成员方法tta(),静态成员方法里什么东西都没有, 再往下到了类外, 类外首先是一个咱们说的spl方法, 里面的参数为空, 再往下, 实例化的类名为xxx。 这个时候 ,咱们上传一个xxx.inc的文件, 通过类实例化对象的时候, 类名并不存在触发spl_autoload_register(),并且该方法参数为空, 于是它就依据自身特性去寻找和实例化类同名的 xxx.php和xxx.inc, 因为咱们之前上传了一个xxx.inc, 于是这个时候xxx.inc被以php代码执行。

此条目发表在php security分类目录,贴了, , , , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注