一.环境配置
我采用的是Windows+phpstudy配置的运行环境,将phpMyAdmin4.8.1下载好解压到phpstudy网站根目录即可,这里需要注意的是php版本和Mysql的版本
配置好后,直接访问http://localhost/phpMyAdmin
登陆成功成功后你会遇到下图
解决方法:
修改phpMyAdmin/libraries文件下的config.default.php里面的$cfg['blowfish_secret']
配置,随意修改保存即可,长度一定要达到要求。
二.漏洞复现
出bug的两处代码
1.phpMyAdmin/index.php的51-64行
根据这几行代码可知要将$_REQUEST[‘target’]所表示的文件包含进来target参数需要满足以下5个条件:
1.不为空
2.是一个字符串
3.不能以index开头
4.不能在 $target_blacklist数组里面(即不能为import.php,export.php)
5.满足Core类里面的checkPageValidity()函数检查
前四个可以轻松绕过,来看看第五个条件
2.phpMyAdmin\libraries\classes\Core.php的443-476行,checkPageValidity()函数
根据以上代码可知要使该函数返回True,必须满足以下三个条件中的一个:
- $page变量值在 $white_list数组中会返回True,以下是数组内容
2.经过mb_substr()和mb_strpos()处理的$page–>$_page的变量值在$_whitelist数组中
3.经过urldecode(),mb_substr(),mb_strpos()处理的$page–>$_page的变量值在$_whitelist数组中,这里值的分析的是$page是经过两次url解码再进行同2相同的函数处理,第一次由服务器自动解码了一次,然后再由urldecode()函数解码一次,所以在构造payload的时候‘?’应该url编码两次–>‘%253f’.
结合这两处代码,可以开始漏洞复现了。
两种漏洞利用方式
1.任意文件包含
任意文件包含通过目录穿越实现,现在我的D盘下有如下文件
,构造payload来包含该文件,http://localhost/phpMyAdmin-4.8.1/index.php?target=db_datadict.php%253f/../../../../../../../../../PC/PyCharm%202020.2/build.txt
,成功包含进来
其他文件包含也是一样的,只需要给定绝对路径即可(不需要盘符).
2.任意代码执行
(1).包含数据库文件
先创建一个数据库用来写入要执行的代码
完成之后再将该文件包含进来,查看数据库路径
现在就可以构造payloadhttp://localhost/phpMyAdmin-4.8.1/index.php?target=db_datadict.php%253f/../../../../../../../../../phpStudy/Extensions/MySQL5.7.26/data/test/test.MYD
,看到代码成功执行。
(2).包含session文件
先在phpMyAdmin界面执行SELECT "<?php phpinfo();?>"
找到了session文件的位置,将它包含进来,构造payloadhttp://localhost/phpMyAdmin-4.8.1/index.php?target=db_datadict.php%253f/../../../../../../../../../phpStudy/Extensions/tmp/tmp/sess_iidu2gfjp0kgsc8b1307ff6utsfcmbon
,代码执行成功。
三.漏洞利用
这里漏洞利用是HCTF-2018的一道web赛题–Warmup,打开之后是一个滑稽笑脸,F12查看源码,
发现source.php这个提示,直接访问它,得到以下代码
这一看就是代码审计,又发现代码里面有hint.php访问看看
这里提示flag不在这里,在ffffllllaaaagggg里面,再结合代码和刚才上面讲的phpMyAdmin漏洞 任意文件包含,可以构造出payloadhttp://1b624b4a-7c5e-4c42-b035-b65f165e5827.node3.buuoj.cn/source.php?file=source.php%253f/../../../../../ffffllllaaaagggg
,成功拿到Flag。