今天看到云舒在群里贴的漏洞公告,原始的文章在

http://www.byte.nl/blog/2011/09/23/security-bug-in-is_a-function-in-php-5-3-7-5-3-8/

后来查了下PHP官方的手册,这个问题是在PHP 5.3.7中更新了is_a()函数的功能。is_a()经常被用于条件判断。

在此前版本的is_a() 的第一个参数如果不是object,则会返回false,现在变成了如果不是object ,则会去执行 __autoload()函数。PHP为此还开了一个bug,但对此bug仍然有争议,部分开发人员认为这个功能是正常的。

Aron Budinszky 07-Sep-2011 11:21

Be careful! Starting in PHP 5.3.7 the behavior of is_a() has changed slightly: when calling is_a() with a first argument that is not an object, __autoload() is triggered!

In practice, this means that calling is_a('23', 'User'); will trigger __autoload() on "23". Previously, the above statement simply returned 'false'.

More info can be found here:
https://bugs.php.net/bug.php?id=55475

Whether this change is considered a bug and whether it will be reverted or kept in future versions is yet to be determined, but nevertheless it is how it is, for now...

但是需要注意的是,PHP是否会对这个问题做出修补仍属未知!在昨天发布的PHP 5.4 beta1 中,并未见到修复了此问题。

这是一个类似于PHP的unserialize()函数可以执行__destruct()/__wakeup()中代码的问题。

漏洞的触发是控制 is_a()函数的第一个参数,该参数会被当做输入传入__autoload()函数,并自动执行__autoload()函数中的代码。能够执行什么功能,取决于__autoload()函数的功能。

验证此问题如下:

测试代码:

<?php

function __autoload($classname){

include_once $classname;

}

function test($str){

print "this is a test<br>";

$object = $str;

  if (!is_a($object, 'SAFE')){

die("not safe!<br>");

}

}

test($_GET["a"]);

?>

测试结果:

但是一般来说,__autoload()函数的功能会用于加载一个文件,比如在DEDECMS中的用法:

//自动加载类库处理

function __autoload($classname)

{

global $cfg_soft_lang;

$classname = preg_replace("/[^0-9a-z_]/i", '', $classname);

if( class_exists ( $classname ) )

{

return TRUE;

}

$classfile = $classname.'.php';

$libclassfile = $classname.'.class.php';

if ( is_file ( DEDEINC.'/'.$libclassfile ) )

{

require DEDEINC.'/'.$libclassfile;

}

else if( is_file ( DEDEMODEL.'/'.$classfile ) )

{

require DEDEMODEL.'/'.$classfile;

}

else

{

if (DEBUG_LEVEL === TRUE)

{

echo '<pre>';

echo $classname.'类找不到';

echo '</pre>';

exit ();

}

else

{

header ( "location:/404.html" );

die ();

}

}

}

此处在加载文件前判断了文件名只能为/[^0-9a-z_]/i 中的字符,相对较为安全。

但在另外某知名CMS中,则没有做任何判断:

function __autoload($class) {

include_once $class.'.php';

if(!class_exists($class,false)) exit('系统加载类失败,类'.$class.'不存在!');

}

由于这个漏洞是需要is_a()函数配合 __autoload() 才能利用,且对PHP版本有要求,因此实际中能够找到利用的地方相对较少。但若是PHP官方坚持不认为这是个漏洞,在未来可能会成为一个一直可以利用的弱点。在PHP5.4中is_a()可能会支持string类型参数,同时此漏洞应该已经上报给了CVE。

PHP之is_a()函数执行代码之总结的更多相关文章

  1. main函数执行前、后再执行的代码

    一.main结束 不代表整个进程结束  (1)全局对象的构造函数会在main 函数之前执行,          全局对象的析构函数会在main函数之后执行:          用atexit注册的函数 ...

  2. 【转】C# 将字符串或表达式直接转为可执行代码的办法

    C# 将字符串或表达式直接转为可执行代码的办法 反射类 using System; using System.Data; using System.Configuration; using Syste ...

  3. 为PHP函数执行设置超时

    如何防止一个函数执行时间过长呢?在PHP里可以用pcntl时钟信号+异常来实现. 代码如下: declare(ticks = 1); function a(){ sleep(10); echo &qu ...

  4. c/c++ main函数执行之前/后

    转载自:http://bbs.csdn.net/topics/300103318#r_78088969 main函数之前--真正的函数执行入口或开始 一种解释: 实际上,在可执行文件被加载之后,控制权 ...

  5. 函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

    最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http ...

  6. C/C++程序在main之前执行代码

    来源:<周哥教IT.C语言深学活用>https://ke.qq.com/course/242707#tuin=a71606 我们在学习C/C++语言的时候,通常认为main函数是整个程序执 ...

  7. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

  8. 通俗易懂的来讲讲js的函数执行上下文

    0.开场白 在平时编写JavaScript代码时,我们并不会和执行上下文直接接触,但是想要彻底搞懂JavaScript函数的话,执行上下文是我们绕不过去的一个知识点. 1.执行上下文栈 JavaScr ...

  9. HTTP.SYS远程执行代码漏洞分析 (MS15-034 )

    写在前言:   在2015年4月安全补丁日,微软发布了11项安全更新,共修复了包括Microsoft Windows.Internet Explorer.Office..NET Framework.S ...

随机推荐

  1. hdu 2818(并查集,带权更新)

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. [图解算法]线性时间选择Linear Select——<递归与分治策略>

    #include <ctime> #include <iostream> using namespace std; template <class Type> vo ...

  3. [知识复习] C语言文件读写

    文件打开 fopen() 返回FILE* 对象,如果打开失败返回NULL,错误代码存入errno中 FILE *fopen( const char * filename, const char * m ...

  4. java入门概念梳理总结

    Java入门学习 简介 public class HelloWorld { public static void main(String []args) { System.out.println(&q ...

  5. TCP连接复用

    转自网络:看到一陌生名词,记录一下 TCP连接复用技术通过将前端多个客户的HTTP请求复用到后端与服务器建立的一个TCP连接上.这种技术能够大大减小服务器的性能负载,减少与服务器之间新建TCP连接所带 ...

  6. Spring.NET学习笔记1——控制反转(基础篇)

    在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...

  7. LCA算法笔记

    LCA,最近公共祖先,实现有多种不同的方法,在树上的问题中有着广泛的应用,比如说树上的最短路之类. LCA的实现方法有很多,比如RMQ.树链剖分等. 今天来讲其中实现较为简单的三种算法: RMQ+时间 ...

  8. code M资格赛 补题

    A: 音乐研究 时间限制:1秒 空间限制:32768K 美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究.他有两段音频,每段音频是一个表示音高的序列.现在袋鼠先生想要在第二段音频中找出与第一段音频最相 ...

  9. [Lydsy1704月赛] 最小公倍佩尔数

    4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 202  Solved: 99[Submit][St ...

  10. BZOJ 2288 【POJ Challenge】生日礼物(贪心+优先队列)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2288 [题目大意] 给出一列数,求最多取m段连续的数字,使得总和最大 [题解] 首先我 ...