Metinfo审计思考

metinfo这个cms很有趣,我觉得可以玩的点也有很多,分享给大家来看
这里主要分析metinfo5.3,首先解压看文件结构
image
首先要梳理这个cms的结构,先要打开index.php去看入口文件的结构

<?php
# MetInfo Enterprise Content Management System 
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
$url=$_SERVER['PHP_SELF'];
$turnurl=dirname('http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]);
$resstr=strstr($url,'index.php/');
if($resstr){  
  $turnurl=str_replace('index.php','404.html',$turnurl);
  header("location:".$turnurl);
}
if(!file_exists('./config/install.lock')){
	if(file_exists('./install/index.php')){
		header("location:./install/index.php");exit;
	}
	else{
		header("Content-type: text/html;charset=utf-8");
		echo "安装文件不存在,请上传安装文件。如已安装过,请新建config/install.lock文件。";
		die();
	}
}
if(file_exists('./update')&&!file_exists('./update/install.lock')){
	header("location:./update/index.php");exit;
}
$index="index";
require_once 'include/common.inc.php';
require_once 'include/head.php';
$index=array();
$index[index]='index';
$index[content]=$met_index_content;
$index[lang]=$lang;
$index[news_no]=$index_news_no;
$index[product_no]=$index_product_no;
$index[download_no]=$index_download_no;
$index[img_no]=$index_img_no;
$index[job_no]=$index_job_no;
$index[link_ok]=$index_link_ok;
$index[link_img]=$index_link_img;
$index[link_text]=$index_link_text;
$show['description']=$met_description;
$show['keywords']=$met_keywords;
require_once 'public/php/methtml.inc.php';
if($met_indexskin=="" or (!file_exists("templates/".$met_skin_user."/".$met_indexskin.".".$dataoptimize_html)))$met_indexskin='index';
if($map&&$met_mobileok&&is_numeric($uid)) {
	if($wap_skin_user != 'wap001' && $wap_skin_user != 'mobile_001' && $wap_skin_user != 'mobile_002' && $wap_skin_user != 'mobile_003' && $wap_skin_user != 'mobile_004' && $wap_skin_user != 'mobile_005' && $wap_skin_user != 'mobile_006') {
		$met_indexskin = 'map';
	} 
}
include template($met_indexskin);
footer();

1-20行判断cms是否是安装状态,后面是初始化各个各个变量
其中注意25行的

require_once 'include/common.inc.php';

我们打开这个文件common.inc.php
注意36到42行这个代码

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

如果玩代码审计比较多人应该知道这里有个任意变量覆盖的风险,具体例子可以参考我的一个漏洞分析:http://blog.csdn.net/niexinming/article/details/53153629
可以通过一个简单的小栗子来演示这段代码

<?php
$a="a";
$b;
global $c;
$c="555";
require_once 'include/common.inc.php';
global $e;
$d;
var_dump($a);
echo "</br>";
var_dump($b);
echo "</br>";
var_dump($c);
echo "</br>";
var_dump($d);
echo "</br>";
var_dump($e);

image
可以看到在require_once 'include/common.inc.php';这段代码上面的变量都被覆盖了无论是否被初始化都被传递进来的参数给覆盖掉了,这段代码下面的变量只要没有被赋值就会被传递进来的参数污染了,所以这就很考验码农对于这个架构的把控能力了,如果稍有不慎就会造成安全问题
举个不是安全的问题的例子供大家玩耍一下
大家可以看的index.php中有这样的一段代码

$index="index";
require_once 'include/common.inc.php';
require_once 'include/head.php';
$index=array();

可以给index.php传递index=2333,看一下效果
image
可以看的代码逻辑被改变了,造成了页面的混乱,而metinfo5.3里面引用到这个代码require_once 'include/common.inc.php';的地方有很多
image
所以可以玩的点有很多,比如可以找到一些任意文件删除的地方,删除一些关键文件来使得一些变量变成未初始化的变量,从而控制整个代码流程

现在metifo最新版的是6.0,他们已经意识到这样的问题,所以对框架做了许多改善,逐渐减少了通过require_once 'include/common.inc.php';引入参数的做法,使得metifo6.0的安全性更强了一些

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值