『黑客与极客』通读审计之DOYOCMS( 二 )


本文插图

在functions文件中 , 跟进import方法 。
『黑客与极客』通读审计之DOYOCMS
本文插图

再来看一下传递进来的值
『黑客与极客』通读审计之DOYOCMS
本文插图

39-43行的
if( TRUE== @is_readable($sfilename) ){
require($sfilename);
$GLOBALS[ 'G_DY'][ 'import_file'][md5($sfilename)] = TRUE;
returnTRUE;
}
进行判断形参$sfilename是否可读 , 可读即包含 。
OK , 了解完import是用来读取文件之后 , 我们随着依次打开
这三个文件 , 看一下都有哪些操作 。
『黑客与极客』通读审计之DOYOCMS
本文插图

哈哈 , 三个文件都是定义的类文件 。
从字面上来看
syController:Controller的表面意思为控制器
syModel:Model的表面意思为模型
syView:View的表面意思为视图
MVC…
再回来读sys.php文件的第29-36行
『黑客与极客』通读审计之DOYOCMS
本文插图

判断分支给$GLOBALS['G_DY']['url']["url_path_base"]进行赋值
再读取sys.php文件的第42-50行
看到!empty($_SERVER['PATH_INFO'] , 是用来实现伪静态化的操作的
下面的52-58行是作为重点 。
『黑客与极客』通读审计之DOYOCMS
本文插图

判断分支给$GLOBALS['G_DY']['url']["url_path_base"]进行赋值
再读取sys.php文件的第42-50行
看到!empty($_SERVER['PATH_INFO'] , 是用来实现伪静态化的操作的
下面的52-58行是作为重点 。
『黑客与极客』通读审计之DOYOCMS
本文插图

跟进syClass与spLaunch方法
functionsyClass($class_name, $args = null, $sdir = null, $force_inst = FALSE){
if(preg_match( "/^[a-zA-Z0-9_\-]*$/",$class_name)== 0)syError( "类定义不存在 , 请检查 。 ");
if( TRUE!= $force_inst) if( isset($GLOBALS[ 'G_DY'][ "inst_class"][$class_name])) return$GLOBALS[ 'G_DY'][ "inst_class"][$class_name];
if( null!= $sdir && !import($sdir) && !import($sdir. '/'.$class_name. '.php')) returnFALSE;
$has_define = FALSE;
if(class_exists($class_name, false) || interface_exists($class_name, false)){
$has_define = TRUE;
} else{
if( TRUE== import($class_name. '.php')){
$has_define = TRUE;
}
}
if( FALSE!= $has_define){
$argString = '';$comma = '';
if( null!= $args) for($i = 0; $i < count($args); $i ++) { $argString .= $comma . "\$args[$i]"; $comma = ', ';}
eval( "\$GLOBALS['G_DY']['inst_class'][\$class_name]= new \$class_name($argString);");
return$GLOBALS[ 'G_DY'][ "inst_class"][$class_name];
}
syError($class_name. "类定义不存在 , 请检查 。 ");
}
『黑客与极客』通读审计之DOYOCMS
本文插图

二、 PHP任意文件替换漏洞
紧接着上面继续往下分析
我们打开sysession文件看一下 。
『黑客与极客』通读审计之DOYOCMS


推荐阅读