官网下载的最新版,文件名是 phpMyAdmin-4.8.1-all-languages.zip

问题就出现在了 /index.php
找到55~63行

第61行出现了 include $_REQUEST['target'];
很明显这是LFI的前兆,我们只要绕过55~59的限制就行
第57行限制 target 参数不能以index开头
第58行限制 target 参数不能出现在 $target_blacklist 内
找到 $target_blacklist 的定义:

就在 /index.php 的第50行
只要 target 参数不是 import.php 或 export.php 就行
最后一个限制是 Core::checkPageValidity($_REQUEST['target'])
找到Core类的checkPageValidity方法:

定义在了 \libraries\classes\core.php 的第443行
问题出现在了第 465 行的 urldecode()
我们可以利用这个函数绕过白名单检测!
我把 ? 两次url编码为 %253f 即可绕过验证!

Payload:
http://127.0.0.1/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../windows/wininit.ini

本以为漏洞到这就结束了,因为我没有找到phpmyadmin可以进行文件操作来实现Getshell的地方,过了好几周后突发灵感,想到了一个不用写文件也能拿Shell的方法。
我们都知道,登入phpmyadmin后,数据库就是完全可以控制的了,那我们是否可以把WebShell写入到数据库中然后包含数据库文件?
本地测试了一下,发现如果把WebShell当做数据表的字段值是可以完美的写入到数据库文件当中的:


找到对应的数据库文件:

包含之:

Payload:
http://127.0.0.1/phpmyadmin/index.php?a=phpinfo();&target=db_sql.php%253f/../../../../../../phpStudy/PHPTutorial/MySQL/data/hack/hack.frm

这篇文章我先发在了我们团队公众号里,后来好多人都说猜不出数据库文件路径令我很尴尬,这个我以为大家都知道就没写。
既然已经登录到phpmyadmin后台,那么就可以执行sql了

源链接

Hacking more

...