首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>漏洞资料>文章内容
New Includes Function -- spl_autoload()
来源:http://www.80vul.com 作者:ryat 发布时间:2010-05-17  

New Includes Function -- spl_autoload()

author: ryat#www.wolvez.org
team:http://www.80vul.com
date:2009-04-13


一、描述

看看手册对这个函数的描述:

spl_autoload
(PHP 5 >= 5.1.2)

spl_autoload — Default implementation for __autoload()


void spl_autoload  ( string $class_name  [, string $file_extensions= spl_autoload_extensions()  ] )

This function is intended to be used as a default implementation for __autoload(). If nothing else is specified and autoload_register() is called without any parameters then this functions will be used for any later call to __autoload().

从描述中可以知道这个函数用来替代类中__autoload方法

 

二、代码分析

spl_autoload()的php源码:

// php_spl.c
PHP_FUNCTION(spl_autoload)
{
...
 char *class_name, *lc_name, *file_exts = SPL_G(autoload_extensions);
 int class_name_len, file_exts_len = SPL_G(autoload_extensions_len), found = 0;
 char *copy, *pos1, *pos2;
...
 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &class_name, &class_name_len, &file_exts, &file_exts_len) == FAILURE) {
  RETURN_FALSE;
 }
 
 if (file_exts == NULL) { /* autoload_extensions is not intialzed, set to defaults */
  copy = pos1 = estrndup(SPL_DEFAULT_FILE_EXTENSIONS, sizeof(SPL_DEFAULT_FILE_EXTENSIONS)-1);
// 如果没有指定file_extensions参数,设定file_extensions为.inc或.php
 } else {
  copy = pos1 = estrndup(file_exts, file_exts_len);
 }
 lc_name = zend_str_tolower_dup(class_name, class_name_len);
 while(pos1 && *pos1 && !EG(exception)) {
...
  if (spl_autoload(class_name, lc_name, class_name_len, pos1 TSRMLS_CC)) {
...
static int spl_autoload(const char *class_name, const char * lc_name, int class_name_len, const char * file_extension TSRMLS_DC) /* {{{ */
{
...
 class_file_len = spprintf(&class_file, 0, "%s%s", lc_name, file_extension);
// 合并 class_name和file_extensions

 ret = php_stream_open_for_zend_ex(class_file, &file_handle, ENFORCE_SAFE_MODE|USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC);
// 打开指定文件
...
 if (ret == SUCCESS) {
  if (!file_handle.opened_path) {
   file_handle.opened_path = estrndup(class_file, class_file_len);
  }
  if (zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS) {
   new_op_array = zend_compile_file(&file_handle, ZEND_REQUIRE TSRMLS_CC);
// 将文件编译成opcode
...
  } else {
   new_op_array = NULL;
...
  }
  if (new_op_array) {
...
   zend_execute(new_op_array TSRMLS_CC);
// 执行opcode :)
   
可以看到,这个函数完全可以替代include/require函数的作用[当然如果你熟悉__autoload方法的使用方法的话,你可能很快就会意识到这点了:)]

三、测试代码

PoC:


// test.php
<?php

spl_autoload('info', '.txt');

// info.txt
<?php

phpinfo();


 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·XSOK环境变量本地命令执行漏洞
·N点虚拟主机管理系统 致命漏洞。
·南方数据企业网站管理系统V10.0
·动网(DVBBS)Version 8.2.0 后
·Solaris 10 telnet漏洞及解决
·破解无线路由器密码,常见无线密
·Nginx %00空字节执行php漏洞
·WinWebMail、7I24提权漏洞
·XPCD xpcd-svga本地缓冲区溢出漏
·Struts2多个漏洞简要分析
·ecshop2.72 api.php 文件鸡肋注
·Discuz!后台拿Webshell 0day
  相关文章
·当magic_quotes_gpc=off
·关于magic_quotes_sybase
·Discuz! 6.x/7.x 全局变量防御绕
·ZIP 文件溢出漏洞
·[CAL-20100204-3]Adobe Shockwav
·[CAL-20100204-2]Adobe Shockwav
·[CAL-20100204-1]Adobe Shockwav
·nginx文件类型错误解析漏洞
·IIS源码泄露及文件类型解析错误
·DEDECMS v5.5 GBK Final 的一个
·Php168一个即将被补的代码执行?
·php168 获取管理员0day
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved